먼저 컨트롤러에서 세션을 가져올 때마다
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를 확인해 보면 이렇게 잘 생성된 것을 볼 수 있다.
검색후 확인해보면 잘 들어가 있다!
'Projects > matjipfind' 카테고리의 다른 글
전체적인 레이아웃 개선 (0) | 2021.02.01 |
---|---|
네이버 로그인 API 등록 (0) | 2021.01.24 |
유저 키워드 기억 기능, 기타 버그 수정 (0) | 2021.01.21 |
Ajax를 이용한 최근키워드 실시간 DB저장 기능 (0) | 2021.01.20 |
Google 로그인 기능과 DB 제작 (0) | 2021.01.18 |
댓글