10월 28일 금요일 [코드로 배우는 스프링웹프로젝트] -3day(2)
PART 3. 기본적인 웹 게시물 관리
스프링 MVC와 MyBatis를 이용해서 기본적인 CRUD와 페이징 처리, 검색 기능의 게시물 관리를 만들 것
Chaper07. 스프링 MVC 프로젝트의 기본 구성
일반적으로 웹 프로젝트는 3-tier(티어) 방식으로 구성됨
Presentation Tier
- 화면 계층 . 화면에 보여주는 기술을 사용하는 영역(Servlet/JSP, 스프링 MVC가 담당하는 영역)
- 프로젝트의 성격에 맞춰 앱으로 제작하거나, CS(Client-Server)로 구성되는 경우도 있음.
- 스프링MVC와 JSP를 이용한 화면 구성이 이에 속함
Business Tier
- 비즈니스 계층. 순수한 비즈니스 로직을 담고 있는 영역
- 고객이 원하는 요구 사항을 반영하는 계층이기 때문에, 요구 사항과 정확히 일치해야 함
- 주로 '~~Service'와 같은 이름으로 구성
- 메서드 이름 역시 고객들이 사용하는 용어를 그대로 사용하는 것이 좋음
Persistence Tier
- 영속 계층 혹은 데이터 계층. 데이터를 어떤 방식으로 보관하고, 사용하는가에 대한 설계가 들어가는 계층
- 일반적으로 데이터베이스를 많이 사용함. 때에 따라 네트워크 호출이나 원격 호출 등의 기술이 접목될 수 있음
- MyBatis와 mybatis-spring을 이용해서 구성함
계층을 스프링 MVC와 맞춰서 설명하면 다음과 같은 구조
스프링 MVC 영역은 Presentation Tier(화면계층)을 구성함. 각 영역은 별도의 설정을 가지는 단위로 볼 수 있음
스프링 Core 영역은 POJO(Plain-Old-Java-Object)의 영역. 스프링 의존성 주입을 이용해 객체 간의 연관 구조를 완성해서 사용
MyBatis 영역은 현실적으로 mybatis-spring을 이용해서 구성하는 영역 ==> SQL에 대한 처리를 담당하는 구조
각 영역의 Naming Convention (명명 규칙)
프로젝트를 위와 같이 3-tier로 구성하는 것은 '유지 보수'에 대한 필요성 때문
각 영역을 독립적으로 설계하여 나중에 특정 기술이 변하더라도 필요한 부분을 쉽게 교환할 수 있게 하는 방식
따라서 각 영역은 설계 당시부터 영역을 구분하고, 해당 연결 부위는 인터페이스를 이용해서 설계함
프로젝트 진행 시 네이밍 규칙
- ~~Controller : 스프링 MVC에서 동작하는 Controller 클래스를 설계할 때 사용
- ~~Service : 비즈니스 영역을 담당하는 인터페이스
- ~~ServiceImpl : 비즈니스 영역 인터페이스를 구현한 클래스
- ~~DAO, ~~Repository : DAO나 Repositroty라는 이름으로 영역을 따로 구성하는 것이 보편적이나, 예제는 MyBatis의 Mapper 인터페이스를 활용할 것
- VO, DTO : VO는 get 메소드만, DTO는 get&set 메소드가 같이 (예제는 테이블과 관련된 데이터는 VO로 정함)
패키지의 네이밍 규칙
앞으로 예제는 이런 식으로 구성할 것
프로젝트를 위한 요구사항
프로젝트를 진행하기 전에 고객의 요구사항을 인식하고 이를 설계하는 과정이 필요함
요구 사항은 온전한 문장으로 정리하는 것이 좋음
주어는 '고객'이고 목적어는 '대상' ==> 게시물을 만든다하면, 여기서 대상은 '게시물'이 된다.
요구 사항은 화면에도 영향을 미치게 된다 ==> 이러한 화면을 설계할 때는 주로 Mock-up(목업) 툴을 이용하는 경우가 많다. 대표적으로 PowerPoint나 Balsamiq studio, Pencil Mockup 등의 SW를 이용해서 작성하면 좋음
각 화면을 설계하는 단계에서 사용자가 입력해야 하는 값과 전체 페이지의 흐름이 설계됨 ==> 화면 흐름을 URL로 구성하게 되는데 이 경우 GET/POST 방식에 대해서 같이 언급해두는 것이 좋음
예제 프로젝트 구성
1) pom.xml 수정 + 추가
==> 스프링 버전(1.8), Java 버전(5.0.7), spring-tx 추가, spring-jdbc 추가, spring-test 추가, HikariCP추가, MyBatis 추가, mybatis-spring추가, Log4jdbc 추가, oracle8 추가, Lombok 추가, jUnit 버전(4.12) , javax.servlet-api 버전 (3.1.0), maven-compiler-plugin의 source와 target 버전(1.8)
2) 테이블 생성
create sequence seq_board; --시퀀스
create table tbl_board(
bno number(10, 0), --게시물 번호
title varchar2(200) not null, --제목
content varchar2(2000) not null, --내용
writer varchar2(50) not null, --작성자
regdate date default sysdate, --생성 시간
updatedate date default sysdate --최종 수정 시간
);
alter table tbl_board add constraint pk_board primary key (bno); --프라이머리키 지정
더미 데이터 추가
insert into tbl_board(bno, title, content, writer)
values (seq_board.nextval, '테스트 제목', '테스트 내용', 'user00');
항상 마지막엔 commit~!!
3) root-context.xml
mybatis-spring 네임스페이스 추가
hikariConfig 추가, dataSource 추가, sqlSessionFactory 추가, mybatis-spring scan 추가
log4jdbc.log4j2.properties 파일 추가 (src/main/resources)
src/test/java 에 org.zerock.persistence 패키지 추가 ==> ex00에서 만든 DataSourceTests.java와 JDBCTests.java 파일 추가