💡 스프링 프로젝트의 구성
스프링 프로젝트는 @Controller, @Service, @Repository의 3 계층으로 구성된다.
@Controller
사용자 입출력 ex) 가입 기간 (가입 후 1105일째)
@Repository
데이터베이스 입출력 ex) 가입일 저장
@Service :
업무 로직 처리 ex) 가입일을 가지고 가입 기간을 계산
우선 수정 혹은 생성해야 하는 파일을 살펴보면 다음과 같다. (🤗 표시 참고) 대략적인 설계는 다음과 같다.
method | url | view | model | parameter | return |
---|---|---|---|---|---|
Get | /board/list | O | O | X | ModelAndView |
Get | /board/read | O | O | bno | ModelAndView |
Get | /board/write | O | X | X | void |
Post | /board/write | redirect to read | X | Board | String |
Post | /board/update | redirect to read | X | Board, password | String |
Post | /board/delete | redirect to list | X | bno, password | String |
작업을 시작하기 전에 src/main/resource 폴더에 있는 application.properties
를 다음과 같이 수정한다.
server.port=8081
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=scott
spring.datasource.password=1234
src/main/java 폴더에 프로젝트를 생성할 때 만든 com.example.demo
패키지 (기본 설정 파일이 들어 있음) 외에 com.example.demo.controller
와 com.example.demo.vo
패키지를 추가한다.
com.example.demo.vo
패키지에 Board
클래스를 생성한다. 내용은 아직 추가하지 않을 것이기 때문에 건드리지 않는다.
com.example.demo.controller
패키지에 BoardController
를 생성한다. 코드는 다음과 같다.
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.example.demo.vo.Board;
@Controller
public class BoardController {
@GetMapping({"/", "/board/list"})
public ModelAndView list() {
return new ModelAndView("board/list");
}
@GetMapping("/board/read")
public ModelAndView read(@RequestParam(required=true, defaultValue="1") Integer bno) {
return new ModelAndView("board/read").addObject("bno", bno);
}
@GetMapping("/board/write")
public void write() {
}
@PostMapping("/board/write")
public String write(@ModelAttribute Board board) {
return "redirect:/board/read";
}
@PostMapping("/board/update")
public String update(@ModelAttribute Board board, @RequestParam String password) {
return "redirect:/board/read";
}
@PostMapping("/board/delete")
public String delete(@RequestParam Integer bno, @RequestParam String password) {
return "redirect:/";
}
}
이제 src/main/resource 폴더에 board 폴더를 만들고 그 안에 list.html
, read.html
, write.html
을 다음과 같이 생성한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org">
<title>Insert title here</title>
</head>
<body>
리스트 페이지입니다.
<a href="/board/read?bno=1">1 번 글입니다.</a>
<a href="/board/write">글쓰기</a>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org">
<title>Insert title here</title>
</head>
<body>
읽기 페이지입니다.
<p>글 번호 <span th:text="${bno}"></span></p>
<form action="/board/update" method="post">
<input type="text" name="password" value="1234">
<button>변경하기</button>
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org">
<title>Insert title here</title>
</head>
<body>
<form action="/board/write" method="post">
<button>보내기</button>
</form>
</body>
</html>
이제 src/main/resource 폴더에 log4jdbc.log4j2.properties
, logback-spring.xml
파일을 복붙해 준다.
<!-- log4jdbc.log4j2.properties 파일 -->
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
<!-- logback-spring.xml 파일 -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern> %d{HH:mm:ss.SSS} %highlight(%-5level) %magenta(%-4relative) --- [ %thread{10} ] %cyan(%logger{40}) : %msg%n </pattern>
</encoder>
</appender>
<!-- 내가 만든 클래스에 대한 로깅 설정 -->
<logger name="com.icia" level="info" />
<!-- 3rd party 로깅 설정 -->
<logger name="org.springframework" level="info" />
<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="trace" />
<!-- log4jdbc 로깅 설정 -->
<logger name="jdbc.connection" level="warn"/>
<logger name="jdbc.resultsettable" level="info"/>
<logger name="jdbc.audit" level="warn"/>
<logger name="jdbc.sqltiming" level="warn"/>
<logger name="jdbc.resultset" level="warn"/>
<root level="info">
<appender-ref ref="console" />
</root>
</configuration>
마지막으로 pom.xml
파일에 아래 코드를 추가해 준다.
<dependencies>
<!-- 오라클 로깅을 위한 log4jdbc : 드라이버를 log4jdbc로 변경한다 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>