Posted by 세상을 살아가는 사람
,
Posted by 세상을 살아가는 사람
,

1조 파비 중고 거래 플랫폼

2조 골라줘 점심즈

3조 All Food In The World

4조 momentum_ex

1조 파비 중고 거래 플랫폼 기획서

기획서1.pdf
0.51MB

1조 파비 중고 거래 플랫폼 발표자료

Pa-Bi-발표자료.pptx
4.07MB

2조 골라줘 점심즈 기획서

골라줘 점심즈- 수정(발표용).pptx
1.79MB

2조 골라줘 점심즈 결과 발표자료

골라줘 점심즈- 최종(발표용).pptx
19.09MB

3조 All Food In The World 기획서

계획서_자바 포토폴리오 3조(최종본).pptx
9.12MB

3조 All Food In The World 결과 발표

FIT-발표자료-최종.pptx
16.57MB

4조 momentum_ex 기획서

Momentum_extension 학원.pdf
0.25MB

4조 momentum_ex 결과 발표

김정현_포트폴리오_학원.pdf
2.47MB

Posted by 세상을 살아가는 사람
,

1. 자바 JDK 11.0.6 설치

2. Tomcat 9 download 및 압축 풀기 : 버전 9.0.62

3. Eclipse IDE for Enterprise JAVA and Web Developer 2022-03-R(4.23) 버전 다움로드 및 압축 풀기

  - 2022-06-R(4.24) 버전이 새로 나온 것 같다. 이것을 설치해도 된다.

  - 이클립스는 내부에 JAVA Open JDK SE 16을 포함하고 있음.

  - Server -> Runtime Environment으로 Tomcat 9 등록 : JRE로 jdk-11.0.6을 지정 (이클립스 내부에 있는 것을 삭제하고, 새로 등록)

4. Dynamic Web Module Project 생성

  - Tomcat 9.0 선택

Posted by 세상을 살아가는 사람
,

STS4를 사용하여 spring starter project를 Spring Data JPA를 설정하여 생성하면, 데이터베이스 설정이 필요하다.

여기서는 Oracle 19c 버전과 연동을 시키고자 한다. 이를 위해서 다음과 같이 설정이 되어야 한다.

1. build.gradle에 JDBC 라이브러리 추가

  - dependencies에 다음을 추가한다.

    implementation group: 'com.oracle.ojdbc', name: 'ojdbc8', version: '19.3.0.0'

  Project and External Dependencies에 ojdbc8.jar 파일이 생성되는 것을 확인할 수 있다.

2. src/main/resources 폴더에 있는 application.properties 파일에 오라클 데이터베이스 연동을 위한 설정을 추가한다.

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=study
spring.datasource.password=study

3. Ex2Application.java 파일을 수행하면 에러 없이 실행되는 것을 알 수 있다.

Posted by 세상을 살아가는 사람
,

정규표현식에 대한 연습을 해볼 수 있는 사이트를 소개한다.

https://regexone.com/lesson/letters_and_digits? 

 

RegexOne - Learn Regular Expressions - Lesson 1½: The 123s

Characters include normal letters, but digits as well. In fact, numbers 0-9 are also just characters and if you look at an ASCII table, they are listed sequentially. Over the various lessons, you will be introduced to a number of special metacharacters use

regexone.com

자바스크립트나 자바에서 많이 사용되지만, 난이도가 있어 어려움이 있는데,

흥미롭게 연습할 수 있는 사이트가 있어 공유해 본다.

Posted by 세상을 살아가는 사람
,
Posted by 세상을 살아가는 사람
,

채규태 지음 스프링 퀵 스타트는 H2 데이터베이스를 사용하고 있다.

나는 오라클 데이터베이스를 사용하여 실습을 진행하고자 한다.

이를 위해 변경사항을 정리해 본다.

1. 데이터베이스 테이블 스페이스 및 사용자 생성

- 사전 전제조건 : Oracle 데이터베이스 19c가 설치되어 있다. SQL developer에서 dba로 접속하여 다음과 SQL 작업을 한다.

- 테이블 스페이스 생성

  + 오라클 데이터베이스가 D:\oraclexe에 설치되어 oradata\ORCL 밑에 테이블 스페이스를 위한 dbf 파일을 생성한다.

create tablespace quickts
datafile 'D:\oraclexe\oradata\ORCL\quickts.dbf' size 100M
autoextend on next 5M;

- 사용자 생성 및 권한 부여

  + username : quick, password : quick

  + quick에게 일반 개발자 권한을 부여한다.

alter session set "_ORACLE_SCRIPT"=true;
create user quick identified by quick
default tablespace quickts temporary tablespace temp;

grant connect, resource to quick;  -- 접속, 자원 사용에 대한 권한
alter user quick quota unlimited on quickts; -- 테이블스페이스 사용 권한

commit;

  + quick 계정을 사용하여 sql developer에 접속 (SID = orcl)

 

2. 데이터베이스 테이블 생성

여기서는 Day 01 Class 6 비지니스 컴포넌트 실습 1을 실습하기 위하여 board 테이블을 생성한다. sql developer를 사용하여 사용자 quick로 접속하여 다음 SQL을 수행한다. seq 컬럼은 12c 이후에 추가된 기능을 사용하여 MySQL과 같이 auto_increment 기능을 적용하였다.

create table board (
    seq INTEGER GENERATED AS IDENTITY,
    title VARCHAR(100) not null,
    writer varchar2(50) not null,
    content varchar2(4000) not null,
    regDate date default sysdate,
    cnt integer default 0
);

alter table board add constraint pk_board primary key (seq);

 

3. JDBC 라이브러리를 사용하여 오라클 데이터베이스를 사용하기 위하여 다음과 같이 Connection을 가져온다. 이때 필요한 driver name, URL, username, password를 설정한다.

- JDBC 드라이브 이름 : oracle.jdbc.driver.OracleDriver

- 데이터베이스 URL : jdbc:oracle:thin:@localhost:1521:orcl

- Username : quick

- Password : quick

package com.springbook.biz.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUtil {
	private static final String DRIVER_NAME = "oracle.jdbc.driver.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String USERNAME = "quick";
	private static final String PASSWORD = "quick";

	public static Connection getConnection() {
		try {
			Class.forName(DRIVER_NAME);
			return DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void close(PreparedStatement stmt, Connection conn) {
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}

	public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
		if (rs != null) {
			try {
				if (!rs.isClosed())
					rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}
}

4. BoardDAO.java를 수정

- 게시글 추가를 위한 SQL 문을 수정 : insert into board(title, writer, content) values(?,?,?)

package com.springbook.biz.board.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;

// DAO(Data Access Object)
@Repository("boardDAO")
public class BoardDAO {
	// JDBC 관련 변수
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	// SQL 명령어들
	private final String BOARD_INSERT = "insert into board(title, writer, content) values(?,?,?)";
	private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET = "select * from board where seq=?";
	private final String BOARD_LIST = "select * from board order by seq desc";

	// CRUD 기능의 메소드 구현
	// 글 등록
	public void insertBoard(BoardVO vo) {
		System.out.println("===> JDBC로 insertBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 수정
	public void updateBoard(BoardVO vo) {
		System.out.println("===> JDBC로 updateBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_UPDATE);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getContent());
			stmt.setInt(3, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 삭제
	public void deleteBoard(BoardVO vo) {
		System.out.println("===> JDBC로 deleteBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_DELETE);
			stmt.setInt(1, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 상세 조회
	public BoardVO getBoard(BoardVO vo) {
		System.out.println("===> JDBC로 getBoard() 기능 처리");
		BoardVO board = null;
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_GET);
			stmt.setInt(1, vo.getSeq());
			rs = stmt.executeQuery();
			if (rs.next()) {
				board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return board;
	}

	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("===> JDBC로 getBoardList() 기능 처리");
		List<BoardVO> boardList = new ArrayList<BoardVO>();
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_LIST);
			rs = stmt.executeQuery();
			while (rs.next()) {
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
				boardList.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return boardList;
	}
}

5. 테스트 코드의 위치

교재에 있는대로 하면 src/test/java/BoardServiceClient.java가 동작하지 않고, Class Not Found Exception이 발생한다.

따라서 파일을 src/main/java/com.springbook.biz.board 패키지 밑으로 이동하여 실행한다.

게시글이 추가되고, 검색이 됨을 알 수 있다.

sql developer를 사용하여 테이블의 데이터를 확인한다.

Posted by 세상을 살아가는 사람
,

자바를 이용한 스프링 강의를 계속하면서 그동안 변경된 개발 환경과 현재 시점에서 개발환경을 어떻게 설정을 해야 하는지 정리해 본다.
1. JDK 1.8을 사용한 개발 환경
- 처음에는 JDK 1.8을 사용하여 개발을 진행
- 이클립스 : 2020-06-R 버전을 사용하여 JAVA EE을 개발하였고, Eclipse Marketplace를 통해 STS를 설치하여 스프링을 개발하였었다.
- 그랬다가 어느 시점에 이클립스에서 STS plugin을 지원하지 않았다. 그래서 이클립스에서 플러긴을 사용하지 않고, 이클립스 기능을 제공하는 STS를 따로 설치하여 스프링을 개발하였다.
2. 별도의 STS를 사용한 스프링 개발 환경
- JDK 1.8을 지원하기 위하여 STS-3.9.15,RELEASE-e4.16.0을 사용
- 이클립스 버전도 JDK 1.8을 지원하기 위해 e4.16(2020-06-R) 버전인 것이다.
- JSP를 개발하기 위한 JAVA EE IDE도 eclipse-jee-2020-06-R 버전을 사용하였다.
3. JDK 11을 사용한 스프링 개발 환경
- 전자정부표준프레임워크 v4.0에서 JDK 11을 지원하고, 상용으로 JDK 11이 사용되게 되는 것 같다. 따라서 JDK 8을 사용하지 않고, JDK 11을 사용하는 환경을 고려해 본다.
- 자바 버전 : JDK 11.0.15
- 이클립스 : 2021-06-R Java EE IDE
- 이클립스 마켓 플레이스에서 "Spring Tools 3 Add-On for Spring Tools 4 3.9.22.RELEASE" Plugin을 설치하여 스프링 개발환경을 설정한다.
- 이때 pom.xml에서 다음과 같은 에러가 발생하면 다음 plugin 설정을 추가한다.
Description Resource Path Location Type
Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer pom.xml /ex08 line 1 Maven Configuration Problem

            <plugin>
            	<groupId>org.apache.maven.plugins</groupId>
            	<artifactId>maven-war-plugin</artifactId>
            	<version>3.3.1</version>
            </plugin>

- 별도의 STS를 사용하여도 되겠지만, 이클립스를 사용한 JSP 개발환경과의 연속성을 위해 이렇게 설정하는 것도 좋은 방법이다.
4. Spring Tools 4 (aka Spring Tool Suite 4) 4.15.1.RELEASE 설치
이클립스에서 STS plugin으로 . "Spring Tools 3 Add-On for Spring Tools 4 3.9.22.RELEASE"을 설치한 후에, Spring Tools 4 (aka Spring Tool Suite 4) 4.15.1.RELEASE을 설치하면, STS4를 설치할 수 있다.

Posted by 세상을 살아가는 사람
,

한빛아카데미 출판사, 박우창, 남송휘, 이현룡 지음, "MySQL로 배우는 데이터베이스 개론과 실습"에 나오는 모델링 연습(마당대학 데이터베이스)에 대한 물리적 모델링 결과는 다음과 같이 이클립스  ER Master를 이용하여 작성하여 보았다.

madang_university.erm
0.05MB

또한 데이터베이스 테이블을 생성하기 위하여 DDL로 변환을 한 결과는 다음과 같다.

/* Drop Triggers */
DROP TRIGGER TRI_Dept_dno;
DROP TRIGGER TRI_Graduate_ssn;
DROP TRIGGER TRI_Professor_ssn;
DROP TRIGGER TRI_Project_pid;

/* Drop Tables */
DROP TABLE work_prog CASCADE CONSTRAINTS;
DROP TABLE Graduate CASCADE CONSTRAINTS;
DROP TABLE work_dept CASCADE CONSTRAINTS;
DROP TABLE Dept CASCADE CONSTRAINTS;
DROP TABLE work_in CASCADE CONSTRAINTS;
DROP TABLE Project CASCADE CONSTRAINTS;
DROP TABLE Professor CASCADE CONSTRAINTS;

/* Drop Sequences */
DROP SEQUENCE SEQ_Dept_dno;
DROP SEQUENCE SEQ_Graduate_ssn;
DROP SEQUENCE SEQ_Professor_ssn;
DROP SEQUENCE SEQ_Project_pid;

/* Create Sequences */
CREATE SEQUENCE SEQ_Dept_dno INCREMENT BY 1 START WITH 1;
CREATE SEQUENCE SEQ_Graduate_ssn INCREMENT BY 1 START WITH 1;
CREATE SEQUENCE SEQ_Professor_ssn INCREMENT BY 1 START WITH 1;
CREATE SEQUENCE SEQ_Project_pid INCREMENT BY 1 START WITH 1;

/* Create Tables */
CREATE TABLE Dept
(
	dno number NOT NULL,
	dname varchar2(30) NOT NULL,
	office varchar2(50) NOT NULL,
	ssn number NOT NULL,
	PRIMARY KEY (dno)
);

CREATE TABLE Graduate
(
	ssn number NOT NULL,
	name varchar2(15) NOT NULL,
	age number NOT NULL,
	deg_prog varchar2(10) NOT NULL,
	dno number NOT NULL,
	graduatessn number NOT NULL,
	PRIMARY KEY (ssn)
);

CREATE TABLE Professor
(
	ssn number NOT NULL,
	name varchar2(15) NOT NULL,
	rank varchar2(15) NOT NULL,
	speciality varchar2(30) NOT NULL,
	age number(3,0) NOT NULL,
	PRIMARY KEY (ssn)
);

CREATE TABLE Project
(
	pid number NOT NULL,
	sponsor varchar2(30) NOT NULL,
	start_date date NOT NULL,
	end_date date NOT NULL,
	budget number NOT NULL,
	ssn number NOT NULL,
	PRIMARY KEY (pid)
);

CREATE TABLE work_dept
(
	ssn number NOT NULL,
	dno number NOT NULL,
	pct_time number(3,0) NOT NULL
);

CREATE TABLE work_in
(
	ssn number NOT NULL,
	pid number NOT NULL
);

CREATE TABLE work_prog
(
	pid number NOT NULL,
	ssn number NOT NULL
);

/* Create Foreign Keys */
ALTER TABLE Graduate
	ADD FOREIGN KEY (dno)
	REFERENCES Dept (dno)
;

ALTER TABLE work_dept
	ADD FOREIGN KEY (dno)
	REFERENCES Dept (dno)
;

ALTER TABLE Graduate
	ADD FOREIGN KEY (graduatessn)
	REFERENCES Graduate (ssn)
;

ALTER TABLE work_prog
	ADD FOREIGN KEY (ssn)
	REFERENCES Graduate (ssn)
;

ALTER TABLE Dept
	ADD FOREIGN KEY (ssn)
	REFERENCES Professor (ssn)
;

ALTER TABLE Project
	ADD FOREIGN KEY (ssn)
	REFERENCES Professor (ssn)
;

ALTER TABLE work_dept
	ADD FOREIGN KEY (ssn)
	REFERENCES Professor (ssn)
;

ALTER TABLE work_in
	ADD FOREIGN KEY (ssn)
	REFERENCES Professor (ssn)
;

ALTER TABLE work_in
	ADD FOREIGN KEY (pid)
	REFERENCES Project (pid)
;

ALTER TABLE work_prog
	ADD FOREIGN KEY (pid)
	REFERENCES Project (pid)
;

/* Create Triggers */
CREATE OR REPLACE TRIGGER TRI_Dept_dno BEFORE INSERT ON Dept
FOR EACH ROW
BEGIN
	SELECT SEQ_Dept_dno.nextval
	INTO :new.dno
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_Graduate_ssn BEFORE INSERT ON Graduate
FOR EACH ROW
BEGIN
	SELECT SEQ_Graduate_ssn.nextval
	INTO :new.ssn
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_Professor_ssn BEFORE INSERT ON Professor
FOR EACH ROW
BEGIN
	SELECT SEQ_Professor_ssn.nextval
	INTO :new.ssn
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_Project_pid BEFORE INSERT ON Project
FOR EACH ROW
BEGIN
	SELECT SEQ_Project_pid.nextval
	INTO :new.pid
	FROM dual;
END;

/

madang_university.sql
0.00MB

 

Posted by 세상을 살아가는 사람
,