관리 메뉴

Just Do it

Part 3) 기본적인 웹 게시물 관리 (Ch7 & 8) 본문

신입 개발자가 되기 위해 공부했던 독학 자료들/코드로 배우는 스프링 웹프로젝트

Part 3) 기본적인 웹 게시물 관리 (Ch7 & 8)

Seojoo21 2022. 2. 16. 13:02

패스트캠퍼스에서 남궁성의 스프링의 정석으로 스프링 공부를 하고 있지만 따로 교재가 없고 강의 업로드도 늦어져 구멍난 곳을 메우기 위해 <코드로 배우는 스프링 웹 프로젝트> 책을 무작정 따라하며 스프링을 공부하고 있다.

 

* 이 카테고리의 글은 <코드로 배우는 스프링 웹 프로젝트> 에서 각 파트별로 진행하는 프로젝트의 흐름을 보기 위해 각 장의 내용을 간단히 요약한 것이다.  

 

* 출처: 코드로 배우는 스프링 웹 프로젝트 개정판, 구멍가게 코딩단, 남가람북스 

 

 

<Part 3. 기본적인 웹 게시물 관리>부터 시작한다. 

 

Ch7. 스프링 MVC 프로젝트의 기본 구성 

1. 예제 프로젝트의 이름: ex02 'Spring Legacy Project'로 생성

2. 프로젝트 생성 -> pom.xml 수정 -> 데이터베이스 관련 처리 -> 스프링MVC처리 순으로 진행 

 

1) pom.xml 수정

- 스프링 버전, Java 버전 등을 수정한다.

- 스프링 관련해서 추가적인 라이브러리로는 spring-tx, spring-jdbc, spring-test가 있다.

- MyBatis를 이용할 것이므로 HikariCP, MyBatis, mybatis-spring, Log4jdbc 라이브러리들도 추가한다.

- 테스트와 Lombok을 위해서 jUnit 버전을 변경하고, Lombok을 추가한다. jUnit의 경우 4.7로 설정되어있으므로 반드시 기존 설정을 변경해주도록 한다. 

- Servlet 3.1(혹은 3.0)을 제대로 사용하기 위해서는 pom.xml에 있던 서블릿 2.5버전이 아닌 3.0이상으로 수정한다.

- Servlet 3.1버전을 제대로 활용하고, JDK8의 기능을 활용하기 위하여 Maven 관련 Java 버전을 1.8로 수정한다.

- 설정 완료 후 Maven > Update Project를 실행

- Oracle JDBC Driver를 프로젝트의 Build Path에 추가하고, Deployment Assembly에도 추가한다.

 

2) 테이블 생성과 더미 데이터 생성

- Oracle SQL Developer 로 테이블을 생성하고 더미 데이터를 만든다. 

 

3) 데이터 베이스 관련 설정 및 테스트

- root-context.xml에는 mybatis-spring 네임스페이스를 추가하고, DataSource의 설정과 MyBatis의 설정을 추가한다.

- root-context.xml은 내부적으로 Log4jdbc를 이용하는 방식으로 구성되어 있으므로 log4jdbc.log4j2properties 파일을 추가해준다. 

- DataSourceTests 클래스와 JDBCTests 클래스를 테스트 패키지에 추가한다. 

- JDBCTests와 DataSourceTests는 웹개발 이전에 테스트를 통해 확인한다.

 

Ch8. 영속/비즈니스 계층의 CRUD 구현 

Part3의 예제는 단순한 하나의 테이블만을 이용하기 때문에 데이터베이스에 테이블, 시퀀스, 약간의 데이터들이 생성되었다면 이제는 코드를 이용해서 데이터에 대한 CRUD 작업을 진행한다.

 

영속 계층의 작업은 항상 다음과 같은 순서로 진행한다.

- 테이블의 칼럼 구조를 반영하는 VO(Value Object: 데이터를 담고 있는 객체 Read Only의 목적이 강함) 클래스의 생성

- MyBatis의 Mapper 인터페이스의 작성/XML 처리

- 작성한 Mapper 인터페이스의 테스트 

 

1) 영속 계층 구현 준비

1-1) VO 클래스의 작성

- VO 클래스를 생성하는 작업은 테이블 설계를 기준으로 작성한다.

- 프로젝트에 org.zerock.domain 패키지(VO, DTO 클래스들의 패키지)를 생성하고, BoardVO 클래스를 정의한다.

 

1-2) Mapper 인터페이스와 Mapper XML

- MyBatis는 SQL을 처리하는데 어노테이션이나 XML을 이용할 수 있다.

- 간단한 SQL 이라면 어노테이션을 이용해서 처리하는 것이 무난하지만, SQL이 점점 복잡해지고 검색과 같이 상황에 따라 다른 SQL문이 처리되는 경우에는 어노테이션은 그다지 유용하지 못하다는 단점이 있다.

- 그래서 Mapper 인터페이스와 Mapper XML을 만들어 MyBatis가 SQL을 처리하도록 해준다.

*XML을 작성할때는 반드시 <mapper>의 namespace 속성값을 Mapper 인터페이스와 동일한 이름을 주는 것에 주의한다.

*<select>태그의 id 속성값은 메서드의 이름과 일치하게 작성한다. 

*resultType 속성의 값은 select 쿼리의 결과를 특정 클래스의 객체로 만들기 위해서 설정한다. 

 

2) 영속 영역의 CRUD 구현

- 웹 프로젝트 구조에서 마지막 영역이 영속 영역이지만, 실제로 구현을 가장 먼저 할 수 있는 것도 영속 영역이다.

- 영속 영역은 기본적으로 CRUD 작업을 하기 때문에 테이블과 VO(DTO) 등 약간의 준비만으로도 비즈니스 로직과 무관하게 CRUD 작업을 작성할 수 있다. 

- MyBatis는 내부적으로 JDBC의 PreparedStatement를 활용하고 필요한 파라미터를 처리하는 '?'에 대한 치환은 #{속성}을 이용해서 처리한다.

 

2-1) Create (insert) 처리 

- tbl_board 테이블은 PK 칼럼으로 bno를 이용하고, 시퀀스를 이용해서 자동으로 데이터가 추가될 때 번호가 만들어지는 방식을 사용한다. 이처럼 자동으로 PK 값이 정해지는 경우에는 다음과 같은 2가지 방식으로 처리할 수 있다.

* insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우

* insert문이 실행되고 생성된 PK 값을 알아야 하는 경우 

- 위의 상황을 고려하여 Mapper 인터페이스와 Mapper XML에 각각 알맞은 내용을 추가한다. 

 

2-2) Read (select) 처리

- insert가 된 데이터를 조회하는 작업은 PK를 이용해서 처리한다. 

- MyBatis는 Mapper 인터페이스의 리턴 타입에 맞게 select의 결과를 처리한다. 

 

2-3) Delete (delete) 처리

- 특정한 데이터를 삭제하는 작업 역시 PK값을 이용해서 처리하므로 Read 작업과 유사하게 처리한다.

- 등록, 삭제, 수정과 같은 DML 작업은 '몇 건의 데이터가 삭제(혹은 수정)되었는지'를 반환할 수 있다.

- delete()의 메서드 리턴 타입은 int로 지정해서 만일 정상적으로 데이터가 삭제되면 1 이상의 값을 가지도록 작성한다. 만일 삭제하려는 게시물이 없다면 0이 출력된다. 

 

2-4) Update (update) 처리 

- 마지막으로 Update 처리를 한다. 게시물의 업데이트는 제목, 내용, 작성자를 수정한다고 가정한다.

- 업데이트할 때는 최종 수정시간을 데이터베이스 내 현재 시간으로 수정한다.

- Update는 delete와 마찬가지로 '몇 개의 데이터가 수정되었는가'를 처리할 수 있게 int타입으로 메서드를 설계할 수 있다.