본문 바로가기
백엔드/웹 개발

12 게시판 만들기

by study_yeon 2023. 6. 26.

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~*^^*>");
	
	}
	
}

info 까지 보임


* 서블릿 설정방법
@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