본문 바로가기
Projects/matjipfind

중복 코드 제거, MySQL 연동

by DawIT 2021. 1. 22.
320x100

먼저 컨트롤러에서 세션을 가져올 때마다

 

        SessionUser user = (SessionUser) httpSession.getAttribute("user");

 

이 코드를 사용한다면 상당히 번거로울 것이다. 따라서 파라미터에서 자동으로 가져올 수 있도록 설정한다.

 

 

LoginUser 어노테이션을 생성해주고, ElementType을 PARAMETER로 설정해준다.

 

package com.david.matjipfind.config.auth;

import com.david.matjipfind.config.auth.dto.SessionUser;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpSession;

@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {

    private final HttpSession httpSession;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
        boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());

        return isLoginUserAnnotation && isUserClass;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception{
        return httpSession.getAttribute("user");
    }
}

 

또한 HandlerMethodArgumentResolver의 구현체로 LoginUserArgumentResolver를 만들어준다. HandlerMethoudArgumentResolver의 supportsParameter는 해당 파라미터가 조건을 충족하는지를 검사하여 boolean 값으로 리턴해준다. 여기서는 요청받은 어노테이션이 LoginUser 가 맞는지, 또 파라미터의 타입이 SessionUser인지를 검사하여 리턴한다.

 

resolveArguemt함수에서는 반환할 객체를 리턴해주면 된다.

 

 

Config파일에서는 addArgumentResolvers함수에서 add함수로 Resolver객체를 추가해주면 준비는 끝난다.

 

 

이제 MainController에서 메서드마다 일일이 세션객체를 받지 않고 어노테이션과 매개변수를 통해 간편하게 받아올 수 있다.

 

또한 이제 MySQL을 연동해보려고 한다.

 

 

가장 먼저 할일은 Dependency 추가이다.

 

그 후 application.properties 파일에 다음 코드를 추가한다.

 

# 콘솔에 실행한 sql문 출력
spring.jpa.show-sql=true

# sql 기본 기능(CRUD) 사용
spring.jpa.generate-ddl=true

# DB로 MySQL 사용
spring.jpa.database=mysql

# url
spring.datasource.url=jdbc:mysql://localhost:3306/matjipfind?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
# username
spring.datasource.username=root
# password
spring.datasource.password=111111
# driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver


spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

# 시작할 때마다 DB DROP
spring.jpa.hibernate.ddl-auto=create

 

spring.jpa.hibernate.ddl-auto=create 로 일단 설정해두었는데, 이 옵션을 사용하면 서버를 재시작할때마다 H2 처럼 테이블을 드랍했다가 다시 생성한다. 일단은 이렇게 사용

 

이제 설정은 끝났다! 다른 설정을 할 필요도 없이 JPA에서 자동으로 Entity클래스에 해당하는 내용으로 쿼리를 만들어 실행해준다.

 

서버를 구동하고 콘솔을 보면 다음을 확인할 수 있다.

 

 

Hibernate: drop table if exists user
Hibernate: create table user (id bigint not null auto_increment, email varchar(255) not null, last_keyword varchar(255), last_position varchar(255), name varchar(255) not null, primary key (id)) engine=InnoDB

 

JPA가 쿼리를 만들어주어서 자동으로 테이블이 생성되었다.

 

 

Workbench를 확인해 보면 이렇게 잘 생성된 것을 볼 수 있다.

 

 

검색후 확인해보면 잘 들어가 있다!

댓글