2023.06.22 수업
교재 : 자바 웹 개발 워크북
● 웹MVC와 JDBC의 결합
- DAO를 구성한 후 서비스 객체와 컨트롤러 객체를 연동해서 최종적으로 실행 가능한 웹 애플리케이션을 제작해야함
▶ 실습
- 모든 기능이 동작하는 웹 어플리케이션(게시판) 만들기
▷ ModelMapper 라이브러리
- TodoDTO는 롬복을 이용하는 것이 더 좋음
- TodoDTO 롬복 활용하여 만들기(변수, 어노테이션 작성)
- DTO와 VO와의 차이 : VO는 Data중 Getter만 있어 읽기만 가능
package org.zerock.jdbcex.domain;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TodoDTO {
private Long tno;
private String title;
private LocalDate dueDate;
private Boolean finished;
}
* ModelMapper라이브러리를 통해 DTO -> VO, VO -> DTO 의 변환
- getter/setter등을 이용해서 객체의 정보를 다른 객체로 복사하는 기능
* 라이브러리 다운
- 3.1.1ver jar파일 다운 프로젝트 lib에 붙여넣기
▷ TodoVO 수정
- 어노테이션 추가(@AllArgsConstructor, @NoArgsConstructor)
- 파라미터 없는 생성자, 모든 필드값이 필요한 생성자
package org.zerock.jdbcex.domain;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter // 멤버변수의 getter속성함수 작성
@Builder // 멤버변수를 이용한 Builder 메소드 실행
@ToString // 멤버변수의 설명메소드 Object로부터 상속
// 추가
@AllArgsConstructor
@NoArgsConstructor
public class TodoVO {
private long tno;
private String title;
private LocalDate dueDate; // 라이브러리 필요
private boolean finished;
}
▷ MapperUtil 만들기
- ModleMapper의 설정을 변경하고 쉽게 사용하기위한 enum 클래스
- modelMapper의 설정을 변경하려면 getConfiguration()을 이용해서 private로 선언된 필드도 접근 가능하도록 설정
- get()을 이용하여 ModleMapper 사
패키지 org.zerock.jdbcex.util
클래스(enum) MapperUtil
package org.zerock.jdbcex.util;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
public enum MapperUtil {
INSTANSE;
private ModelMapper modelMapper;
// 생성자 (private), 선언하면 바로 초기화 되어 사용 가능(static과 유사)
MapperUtil() {
this.modelMapper = new ModelMapper();
// modelMapper의 설정을 private로 선언된 필드도 접근 가능하도록 변경
this.modelMapper.getConfiguration()
.setFieldMatchingEnabled(true) // 이름 같은 것 끼리 맵핑해라
.setFieldAccessLevel(org.modelmapper.config. // 각 항목별로 접근(비교)해라
Configuration.AccessLevel.PRIVATE)
.setMatchingStrategy(MatchingStrategies.STRICT); // 비교방법(같은 형태끼리 비교)
}
// ModelMapper를 호출
public ModelMapper get() {
return modelMapper;
}
}
▷ TodoService와 ModelMapper테스트
○ TodoService
- ModleMapper의 동작 확인
- ModleMapper와 TodoDAO이용
- TodoDTO 등록하는 기능
패키지 org.zerock.jdbcex.service
클래스(enum) TodoService
package org.zerock.jdbcex.service;
import java.util.List;
import java.util.stream.Collectors;
import org.modelmapper.ModelMapper;
import org.zerock.jdbcex.dao.TodoDAO;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.domain.TodoVO;
import org.zerock.jdbcex.util.MapperUtil;
import lombok.extern.log4j.Log4j2;
@Log4j2
public enum TodoService {
INSTANCE;
/// 멤버변수
private TodoDAO dao;
private ModelMapper modelMapper;
/// 생성자
// 모델 설정에 따른 모델객체 생성
TodoService() {
dao = new TodoDAO();
modelMapper = MapperUtil.INSTANSE.get();
}
public void register(TodoDTO todoDTO) throws Exception {
TodoVO todoVO =
modelMapper.map(todoDTO, TodoVO.class);
// int를 반환하므로 이를 이용해서 예외처리
dao.insert(todoVO); // dao의 insert에 todoVO를 넘김
}
}
* 스프링 데이터 관리법
1) JDBC 순수
2) JDBC 템플릿
3) MyBatis - sql을 외부로 빼냄
4) JPA - sql을 사용하지 않고 만들어줌
○ 테스트 코드를 통한 등록 확인
- JUnit Test Case만들기
- TodoVO가 정상적으로 출력되는지 insert가 정상적으로 실행되었는지 확인
패키지 org.zerock.jdbcex
클래스 TodoServiceTestApp
package org.zerock.jdbcex;
import java.time.LocalDate;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
class TodoServiceTestApp {
private TodoService todoService;
@BeforeEach
public void ready() {
todoService = TodoService.INSTANCE;
}
@Test
public void testRegister() throws Exception {
TodoDTO todoDTO = TodoDTO.builder() // 빌더패턴 활용
.title("JDBC Test Title")
.dueDate(LocalDate.now())
.build();
todoService.register(todoDTO);
}
}
● Log4j2와 @Log4j2
- 보안을 위함
- 2.17.0이상 버전 이용(안전성)
- 기존에는 sysout을 통해 로그를 출력했음, 개발 후에는 주석처리해야함
-> 이것을 개선
- 레벨이라는 설정이 있음
* 레벨(Level)과 어펜더(Appender)
- 레벨(Level) : 로그의 중요도 개념, 필요한 레벨의 로그와 실제 운영 시에 필요한 로그를 쉽게 구분
(참고) 레벨을 지정하면 해당 레벨 이상의 로그들이 출력이 됨
- 어펜더(Appender) : 로그를 어떤 방식(콘솔, 파일 등)으로 기록할 것인지 의미
* log4j2의 설정내용
1) Appender : 로그를 남기는 방법
2) Loggers :
- 위에서 설정한 Appender를 이용하여 로그를 남긴다.
- 로그의 레벨을 지정한다.(로그의 중요도 개념)
- 실제 로그를 적용할 그룹을 나눈다.
* 로그의 레벨
낮음(상세) 높음(간단)
TRACE DEBUG INFO WARN ERROR FATAL
▷ 라이브러리 다운
- 버전 맞춰주기
1) Apache Log4j Core » 2.20.0
- 2.17.1 이후 jar 파일 다운
2) Apache Log4j API » 2.20.0
3) Apache Log4j SLF4J Binding » 2.20.0
-> 다운받은 파일 WEP-INF > lib에 복사하기
▷ log4j2 설정법
○ 인텔리제이 이용 시(build.gradle 이용)
- 설정파일 이용하여 라이브러리 설정
xml 파일 이용하여 설정
JavaWeb/src/main 아래 resources/log4j2.xml 작성
-> resources 폴더와 xml 파일이 만들어짐
* xml 파일 (어펜더, 로그레벨 설정하는 파일)
Appenders : 출력하는 콘솔
PatternLayout : 어떻게 찍는지 설정함, pattern : 형식
target : 찍는 장비, "SYSTEM_OUT" : 화면 출력
Loggers : 로그를 찍음
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration : log4j2의 설정내용이 들어가는 메인태그 -->
<Configuration>
<!-- log4j2의 설정내용은
Appender / Loggers로 나뉜다.
-->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern ="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -%msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" /> // 이름 일치
</Root>
</Loggers>
</Configuration>
▷ TodoService에 @Log4j2 추가
package org.zerock.jdbcex.service;
import java.util.List;
import java.util.stream.Collectors;
import org.modelmapper.ModelMapper;
import org.zerock.jdbcex.dao.TodoDAO;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.domain.TodoVO;
import org.zerock.jdbcex.util.MapperUtil;
import lombok.extern.log4j.Log4j2;
@Log4j2
public enum TodoService {
동일
public void register(TodoDTO todoDTO) throws Exception {
TodoVO todoVO =
modelMapper.map(todoDTO, TodoVO.class);
// 0622 8교시(로그 방식 변경)
// System.out.println("todoVO : " + todoVO);
log.info(todoVO);
// int를 반환하므로 이를 이용해서 예외처리
dao.insert(todoVO); // dao의 insert에 todoVO를 넘김
}
}
○ SpringTood Suite4 이용 시
- build.gradle 사용하지 않는 경우
- JavaWeb/src/main/webapp/WEB-INF 아래 classes 폴더 만들기
▷ classes에 xml파일 만들기
- 파일명 : log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> 가 작성된 파일이 생김
* xml의 규칙
- 태그를 열었으면 닫아야함
내용이 있을 경우 : <tag href="">글 제목입니다.(요소, 내용이 들어가는 부분)</tag>
내용이 없을 경우 : <tag href="" /> 또는 <tag href=""></tag>
@Log4j2 : log4j2 사용메소드를 이용해서 작동
@Slf4j : 스프링에서 인터페이스 스펙을 사용하여 모든 자바로그 라이브러리에 동일한 사용방법을 적용할 수 있다.
▷ TodoListController 실행
- 설정한 레벨까지 보임
package org.zerock.jdbcex.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
import lombok.extern.log4j.Log4j2;
@WebServlet(name = "todoListController", urlPatterns = "/todo/list")
@Log4j2 // log4j2 사용메소드를 이용해서 작동
// @Slf4j // 스프링에서 인터페이스 스펙을 사용하여 모든 자바로그 라이브러리에 동일한 사용방법을 적용할 수 있다.
public class TodoListController extends HttpServlet {
private TodoService todoService =
TodoService.INSTANCE; // enum상수클래스의 생성자
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
log.info("todoController // todo List.........");
log.error("에러"); // 여기부터 res까지 필요없는 부분
log.warn("경고");
log.info("정보");
log.debug("버그 잡기");
log.trace("자세한 정보");
res.getWriter().append("<Hello Everyone~*^^*>");
}
}
* 서블릿 설정방법
@WebServlet(name = "todoListController", urlPatterns = "/todo/list")
-> name과 urlPatterns는 유일해야한다
(참고) 어노테이션을 사용하지 않고 WEP-INF에 web.xml파일을 생성하여 web.xml에 <servlet>태그를 활용하여 설정 가능
* web.xml 파일은 서버가 시작할 때 웹서버가 사용하는 환경설정 파일
▷ 목록기능 구현
- 서블릿 만들기
패키지 org.zerock.jdbcex.controller
클래스 TodoListController
package org.zerock.jdbcex.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
import lombok.extern.log4j.Log4j2;
@WebServlet(name = "todoListController", urlPatterns = "/todo/list")
@Log4j2 // log4j2 사용메소드를 이용해서 작동
// @Slf4j // 스프링에서 인터페이스 스펙을 사용하여 모든 자바로그 라이브러리에 동일한 사용방법을 적용할 수 있다.
public class TodoListController extends HttpServlet {
private TodoService todoService =
TodoService.INSTANCE; // enum상수클래스의 생성자
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
log.info("todoController // todo List.........");
}
}
'백엔드 > 웹 개발' 카테고리의 다른 글
14 게시판 만들기 (0) | 2023.06.27 |
---|---|
13 게시판 만들기 (0) | 2023.06.27 |
11 게시판 만들기( JDBC 구현 ) (0) | 2023.06.23 |
10 (JDBC 프로그래밍 준비) (0) | 2023.06.23 |
9 (EL 표현식) (0) | 2023.06.23 |