티스토리 뷰
2024.04.22 _ 스프링 MVC 프로젝트 (with MyBatis) 구성 예시 / log4j.xml -> debug
Ji@n 2024. 4. 22. 17:50
스프링 MVC 프로젝트 (with MyBatis) 구성 예시
1. 게시판(BOARD) 데이터를 저장하는 BOARD 테이블 생성
2. BoardMapper와 BOARD 테이블 사이에 데이터 전송을 위한 BoardVO 클래스를 생성한다.
(BoardVO 클래스는 필드(멤버변수)와 BOARD 테이블 컬럼이 one to one 으로 매핑된 데이터 객체)
3. MyBatis 프레임워크의 구성요소인 BoardMapper 인터페이스 , BoardMapper.xml을 생성
* BoardMapper 인터페이스는 BOARD 테이블에 대한 쿼리 수행 및 결과값 반환 등을 수행한다.
Mapper xml 설정
namespace : 연결할 Mapper 인터페이스 경로 및 이름
BoardMapper 인터페이스 경로를 넣으면 된다.
<resultMap> : DB 쿼리 반환 데이터와 Entity 클래스(=VO)의 멤버 변수 매핑을 정의하는 태그
속성
type : 연결할 클래스
id : SQL쿼리 정의 태그에서 인식되는 이름
BoardVO 경로를 넣으면 된다.
<select>, <insert>, <update>, <delete> : SQL 쿼리 정의 태그
- 속성
id : Mapper 인터페이스 메서드 매핑 역할.
resultMap : 쿼리 결과를 resultMap에 매핑. <resultMap> 태그의 id를 적용
resultType : 쿼리 결과를 클래스에 매핑
<insert id="insert">
<!-- 게시글 등록 -->
INSERT INTO BOARD VALUES
(BOARD_SEQ.NEXTVAL, #{boardTitle}, #{boardContent}, #{memberId}, SYSDATE)
</insert>
<!--
#{변수명} : Mapper 인터페이스 메소드 매개변수와 매핑되어 전송된 데이터를 적용
-->
<select id="selectList" resultMap="boardResultMap">
<!-- 전체 게시글 조회 -->
SELECT * FROM BOARD ORDER BY BOARD_ID DESC
</select>
<select id="selectOne" resultMap="boardResultMap">
<!-- 특정 게시글 조회 -->
SELECT * FROM BOARD WHERE BOARD_ID = #{boardId}
</select>
<update id="update">
<!-- 특정 게시글 수정 -->
UPDATE BOARD SET
BOARD_TITLE = #{boardTitle},
BOARD_CONTENT = #{boardContent},
BOARD_DATE_CREATED = SYSDATE
WHERE BOARD_ID = #{boardId}
</update>
<delete id="delete">
<!-- 특정 게시글 삭제 -->
DELETE BOARD
WHERE BOARD_ID = #{boardId}
</delete>
4.비지니스 로직을 수행하는 BoardService를 만든다. BoardController와 BoardMapper의 중간 계층 역할이다.
5. 클라이언트와 데이터 전송을 위한 BoardController를 생성한다. BoardService에 데이터를 전송하거나
BoardService로부터 데이터를 받아서 View로 전송한다.
BoardController 사용 어노테이션
@Controller // @Component
// - 클라이언트(JSP 페이지 등)와 service를 연결하는 역할
@RequestMapping(value="/board") // url : /ex02/board
@Log4j
@Controller // @Component
// - 클라이언트(JSP 페이지 등)와 service를 연결하는 역할
@RequestMapping(value="/board") // url : /ex02/board
@Log4j
public class BoardController {
@Autowired
private BoardService boardService;
// 전체 게시글 데이터를 list.jsp 페이지로 전송
@GetMapping("/list")
public void list(Model model) {
log.info("list()");
List<BoardVO> boardList = boardService.getAllBoards();
model.addAttribute("boardList",boardList);
}
// register.jsp 페이지 호출
@GetMapping("/register")
public void registerGET() {
log.info("registerGET()");
}
// register.jsp 에서 전송받은 게시글 데이터를 저장
@PostMapping("/register")
public String registerPOST(BoardVO boardVO, RedirectAttributes reAttr) {
log.info("registerPOST()");
log.info("boardVO = " + boardVO.toString());
int result = boardService.createBoard(boardVO);
log.info(result + "행 등록");
return "redirect:/board/list";
};
}
이 구성은 기능 및 역할에 따른 관심사를 분리하고, 코드를 모듈화한 방식이다.
스프링에서 모듈화된 코드는 재사용하거나 테스트 하기 용이하다.
log4j.xml -> debug 모드로 변경
콘솔 창에 디버그 모드로 떠서
DEBUG: com.mokcoding.ex02.persistence.ExampleMapper.getDate - ==> Preparing: SELECT SYSDATE FROM DUAL
DEBUG: com.mokcoding.ex02.persistence.ExampleMapper.getDate - ==> Parameters:
DEBUG: com.mokcoding.ex02.persistence.ExampleMapper.getDate - <== Total: 1
이런 식으로 나타나서 오류를 찾기 훨씬 편함
오늘 배운 것 정리
xml -> 자바로 설정할 수 있다.
web.xml -> WebConfig.java,
servlet-context.xml -> ServletConfig.java,
root-context.xml -> RootConfig.java
를 자바로 바꿀 수 있음
pom.xml은 자바로 못바꿈
프로젝트 생성하고 초기 설정
1. pom.xml 2에서 복붙하고 name 이랑 artifactId 변경
2. xml 파일들(web,root,service) 삭제
3. config 패키지 생성 후 복붙() ,
RootConfig 변경
4. properties > server , Targerted runtime , Project Facets (Dynamic Web Module 4.0 , Java 11로 설정)
5. Server 우클릭 > Add and Remove > 안쓰는 프젝 빼기
6. 서버 clean 하고도 안되면 Maven > Update Project