CRUD 실습
C (create) : INSERT
R (read) : SELECT
U (update) : UPDATE
D (delete) : DELETE
이번 프로젝트는 기본 CRUD를 활용하여 웹어플리케이션을 만들어볼 것이다.
이 어플리케이션은 회원가입 및 로그인 기능이 있으며,
공지사항 게시판, 일반게시판, 사진게시판이 있다.
시작하기 전 세팅
- 서버세팅, 이클립스 프로젝트 생성방법
- 프로젝트 생성하기
- New > Dynamic Web Project
- 프로젝트명 webProject, context root명 web, 서버의 포트번호 8887(이전 프로젝트와 겹치지않게)
>> url 기본 주소는 http://localhost:8887/web 가 된다.
** /web까지가 프로젝트 폴더의 webapp을 가리킨다.
뒤로 파일의 디렉토리 경로를 입력하면 직접 브라우저에서 확인 가능 - src/main/java 하위구조
- 자바 소스파일을 위치시킨다.
- 배포에 직접 반영되지 않으나 컴파일된 파일이 wbapp의 classes 폴더에 저장된다.
| com \ br | ① | 하위로 common, board, member, notice를 만든다. common을 제외한 세개는 controller, model(아래로 vo, dao, service) 폴더 생성 |
| db \ driver | ② | |
| db \ sql | ③ |
- src/main/webapp 하위구조
- html, jsp 등의 파일을 저장하는 곳
- 배포에 실제 쓰이는 폴더
| \ META-INF | ④ | |
| \ WEB-INF \ classes | ⑤ | [Properties]-[Java Build Path]의 output folder의 지정경로. 컴파일 후 자동으로 java 폴더 아래와 구조가 동일해지고 .class파일이 저장된다. |
| \ WEB-INF \ lib | ⑥ | 외부 라이브러리 파일을 저장할 곳. ojdbc6.jar 파일을 붙여넣는다. |
| \ resources | ⑦ | 하위로 image, css, js 폴더를 만든다. |
| \ views | ⑧ | 하위로 jsp파일을 저장할 common, board, member, notice 폴더를 만든다. |
시작을 위한 기본 클래스, 파일 생성
- oracle에서 id: SERVER, pwd: SERVER 계정을 등록 및 최소 권한을 부여한다.
테이블 및 데이터도 세팅해준다. - ① 하위 member\model\vo 패키지 안에 Member 클래스 생성
- userNo, userId,.. 등의 회원 정보를 필드로 저장하고 기본생성자, 매개변수 생성자, getter/setter 등의 메소드 생성 - ② 위치에 driver.properties 파일 만들기 (키=밸류 세트를 저장해놓고 뽑아쓰는 용도)
**이클립스에서 만들때는 [New]-[File]에서 파일명을 .properties로 지정하면 된다.
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=SERVER
password=SERVER - ③ 위치에 회원관련 sql문을 저장해 둘 member-mapper.xml 파일 만들기
<entry key="보통 메소드명으로 명명"> PreparedStatement용 sql문 작성 </entry>
의 형태로 쿼리문을 동적으로 가져온다(서버를 멈추지 않고서도 수정 가능하도록) - ③ 위치에 게시판 관련 sql문을 저장할 board-mapper.xml과 공지 관련 sql문을 저장할 board-mapper.xml을 만든다.
DB 연결 세팅
클래스명 JDBCTemplate
생성위치 : src/main/java/com/br/common
간편한 사용 : static 메소드
- JDBC과정에서 빈번하게 사용되는 코드들을 static 메소드로 활용하면 코드가 줄어든다
>> 객체생성 없이도 불러올 수 있기 때문 - 호출방법1)
import com.br.JDBCTemplate;
JDBCTemplate.getConnection(conn); - 호출방법2)
import static com.br.JDBCTemplate. * ;
getConnection(conn);
>> 클래스명을 붙이지 않고도 불러올 수 있다!
단, 모든 메소드를 사용한다는 ' * '는 이클립스가 임의로 없애는 경우가 있으니 메소드 적용이 잘 안될경우 import구문을 확인할것
Connection 객체를 반환하는 메소드
- prop.load(new FileInputStream(파일의 경로)) :
1.커넥션 객체를 만들때 필요한 값들은 driver.properties 파일 안에 있다.
이것을 Properties 객체인 prop에 담아보자.
2. load() 메소드는 외부에 있는 properties 파일을 읽어들일 수 있게 한다.
3. 이때, 파일과 직접적으로 연결되는 기반스트림이 필요함 == FileInputStream
객체 생성시 매개변수로 파일의 경로를 입력해야한다.
4. 단, src/main/java 폴더 안에 직접 저장한 파일 말고, 자동으로 동기화된
[ src/main/webapp/WEB-INF/classes/db/driver/driver.properties ] 파일로 읽어들여야 한다!
이것이 실제로 배포되는 폴더이기 때문
5. 해당 파일의 물리적인 경로 (C:/부터 시작하는 경로)를 확보해서 FileInputStream 생성자 매개변수로 제시해야함.
해당 경로를 변수 filePath에 담자.
5-1) 작업중인클래스명.class >> 컴파일된 클래스의 위치로부터 경로를 탐색한다.
5-2) .getResource("/경로") >> 파일을 찾는 메소드.
매개변수의 첫번째 / 는 5-1위치의 최상위폴더를 가르킨다. 현재의 경우 classes
5-3) .getResource("/db/driver/driver.properties")
>> 거기서부터 내가 원하는 경로 및 파일을 제시한다.
5-4) JDBCTemplate.class.getResource("/db/driver/driver.properties")
>> 내가 작업중인 클래스를 이용해서 driver.properties의 파일을 찾아냄.
5-5) .getPath() >> 해당 파일의 물리적인 경로를 반환함.
5-6) filePath에 담기는 문자열 =
"C:/workspaces/06_web-workspace/webProject/src/main/webapp/WEB-INF/classes/~~~" - ojdbc6 연동
>> 그냥 바로 WEB-INF/lib 폴더 안에 붙여놓음으로써 연동과정 필요 없음. - conn.setAutoCommit(false);
>>팀 구성원중에 맥 유저가 있을 수 있어서 추가한다.
sql 실행시마다 수기로 commit을 진행할것이므로 자동commit은 꺼도 상관없음
public static Connection getConnection() {
Connection conn = null;
Properties prop = new Properties();
String filePath = JDBCTemplate.class.getResource("/db/driver/driver.properties").getPath();
try {
prop.load(new FileInputStream(filePath));
} catch (IOException e) {
e.printStackTrace();
}
try {
// jdbc driver 등록
Class.forName(prop.getProperty("driver"));
// db의 url, 계정명, 비밀번호 제시해서 Connection 생성
conn = DriverManager.getConnection(
prop.getProperty("url"),
prop.getProperty("username"),
prop.getProperty("password"));
conn.setAutoCommit(false);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
commit을 수행하는 메소드
- Connection 객체를 전달받아 commit을 수행한다
public static void commit(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
rollback을 수행하는 메소드
- Connection 객체를 전달받아 rollback을 수행한다
public static void rollback(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
객체를 반납하는 메소드 (오버로딩)
- Connection객체, Statement객체, ResultSet객체 를 전달받아 반납하는 메소드
- 매개변수를 달리해서 각각 오버로딩 한다
- PreparedStatement는 Statement의 자손으로 다형성을 적용받아 메소드 사용 가능하다
public static void close(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
.....

'다양한 기술들 > 레거시 Web 실습' 카테고리의 다른 글
| [05] 모달을 사용한 비밀번호변경 (0) | 2023.01.06 |
|---|---|
| [04] 회원정보변경 (0) | 2023.01.06 |
| [03] 마이페이지 (0) | 2023.01.05 |
| [02] 회원가입 기능 (0) | 2023.01.05 |
| [01] 메뉴바와 로그인 (0) | 2023.01.04 |
댓글