데이터베이스 사용 저장소로 시큐리티와 어노테이션 기능 세션 사용하기 2.0으로 (3): 개선하기, 5. OAuth 구현하기 로그인 스프링 기반으로
1. getAttribute(“user”);index 메소드 외에 딴 제어기와 메소드에서 세션 값이 기중하다 그때그때마다 몸소 세션에서 값을 가져와야그래서 이 갈래을 메소드 성분로 세션값을 곧 받을 수 있도록 개정해보기 4. 어노테이션 근거으로 개선하기일반적인 프대수래밍에서 개선이 기중하다 나쁜 코드는 대표적으로 되풀이되는 코드같은 코드를 끊임없이해서 복사/붙여넣기로 제 곳에 기록한다면, 이강에 수정이 기중하다 때 모든 갈래을 단독씩 찾아가며 수정해야이렇게 될 과우 끊임없이보전성이 떨어질 수밖에 없으며, 수정이 거울되지 않은 되풀이 코드가 위치하다면 문제가 발생할 수밖에 기위 만든 코드에서 개선할 만한 것은 IndexController에서 세션값을 가져오는 갈래SessionUser user = (SessionUser) httpSession. 4.
book. studying. auth 묶음에 나중과 같이 @LoginUser 어노테이션을 나중과 같이 생성묶음 com. @LoginUserconfig.
lang. auth;import java. config. 용수철boot.
annotation. lang. ElementType;import java. annotation.
RetentionPolicy;import java. annotation. lang. Retention;import java.
매개변수)@Retention(RetentionPolicy. 과녁;@과녁(ElementType. annotation. lang.
LoginUserArgumentResolver같은 곳에 LoginUserArgumentResolver라는 HandlerMethodArgumentResolver 인터페이스를 구현한 클래스를 나중과 같이 기록HandlerMethodArgumentResolver는 가정에 맞는 과우 메소드가 위치하다면, HandlerMethodArgumentResolver의 구현체가 결정한 값으로 관계 메소드의 매개변수를 넘길 수 있음묶음 com. 2. 매개변수): 관계 어노테이션이 생성될 수 있는 곳를 결정매개변수로 결정했으니, 메소드의 매개변수로 공포된 객관에서만 고용할 수 있음이 외에도 클래스 공포문에 쓸 수 있는 모양 등이 있음 @interface: 이 기록철을 어노테이션 클래스로 결정LoginUser라는 이름을 가진 어노테이션이 생성되었다고 보면 됨 4. RUNTIME)public @interface LoginUser {}@과녁(ElementType.
config. 용수철boot. book. studying.
용수철boot. book. studying. auth;import com.
SessionUser;import lombok. dto. auth. config.
MethodParameter;import org. 자심. 용수철framework. RequiredArgsConstructor;import org.
용수철framework. Component;import org. 납판. 용수철framework.
WebDataBinderFactory;import org. support. bind. 월드와이드웹.
request. context. 월드와이드웹. 용수철framework.
method. 월드와이드웹. 용수철framework. NativeWebRequest;import org.
월드와이드웹. 용수철framework. HandlerMethodArgumentResolver;import org. support.
servlet. 모범AndViewContainer;import javax. support. method.
class) != null;boolean isUserClass =SessionUser. getParameterAnnotation(LoginUser. HttpSession;@RequiredArgsConstructor@Componentpublic class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {피비 final HttpSession httpSession;@Overridepublic boolean supportsParameter(MethodParameter parameter) {boolean isLoginUserAnnotation =parameter. http.
getAttribute(“user”);}} supportsParameter()는 제어기 메소드의 특수 매개변수를 지원하는지 감정예서는 매개변수에 @LoginUser 어노테이션이 붙어 있고, 매개변수 클래스 모양이 SessionUser. getParameterType());return isLoginUserAnnotation && isUserClass;}@Overridepublic Object resolveArgument(MethodParameter parameter, 모범AndViewContainer mavContainer,NativeWebRequest 월드와이드웹Request, WebDataBinderFactory binderFactory) 투구 Exception {return httpSession. equals(parameter. class.
studying. WebConfig@LoginUser를 고용하기 위한 배경은 구성되었고, 이제 생성된 LoginUserArgumentResolver가 스프링에서 감각될 수 있도록 WebMvcConfigurer에 가미 config 묶음에 WebConfig 클래스를 생성하여, 나중과 같이 설정을 가미묶음 com. 3. class인 과우 true를 교납 resolveArgument()는 매개변수에 전달할 객관를 생성하며, 예서는 세션에서 객관를 가져옴 4.
studying. config;import com. 용수철boot. book.
auth. config. 용수철boot. book.
context. 용수철framework. RequiredArgsConstructor;import org. LoginUserArgumentResolver;import lombok.
월드와이드웹. 용수철framework. Configuration;import org. annotation.
용수철framework. HandlerMethodArgumentResolver;import org. support. method.
annotation. config. servlet. 월드와이드웹.
add(loginUserArgumentResolver);}}HandlerMethodArgumentResolver는 노상 WebMvcConfigurer의 addArgumentResolvers()를 통석 가미해야딴HandlerMethodArgumentResolver가 소요하다면, 같은 방식으로 가미해주면 됨 4. 명부;@RequiredArgsConstructor@Configurationpublic class WebConfig implements WebMvcConfigurer {피비 final LoginUserArgumentResolver loginUserArgumentResolver;@Overridepublic void addArgumentResolvers(명부
addAttribute(“posts”, postsService. index()모든 설정이 끝났으니, IndexContorller의 코드에서 되풀이되는 갈래들을 @LoginUser로 개선하기@RequiredArgsConstructor@Controllerpublic classIndexController {@GetMapping(“/”)public String index(모범 모범, @LoginUser SessionUser user) {모범. IndexController. 4.
getAttribute(“user”)로 가져오던 세션 데이터 값이 개선됨이제는 어느 제어기든지 @LoginUSer만 고용하면, 세션 데이터를 가져올 수 있음 거듭 애플리케이션을 실행해, 대수인 기능이 정상적으로 작동하는 것을 인정 5. getName());return “index”;}기존에 (Session User) httpSession. addAttribute(“userName”, user. findAllDesc());국제경기연맹 (user != null) 모범.
1. 세션 저곳사실 현직에서는 세션 저곳에 거학 나중 3제일귀 중 한 제일귀를 간택 5. 1. 세션 저곳로 데이터베이스 고용하기금방까지 아등가 만든 서비스는 세션이 내보 톰캣에 갈무리되어, 애플리케이션을 재실행하면 대수인이 어닐링기본적으로 세션은 실행되는 WAS의 메모리에 갈무리되고 구환됨메모리에 갈무리되다 보니 내보 톰캣처럼 애플리케이션 실행 시 실행되는 건물에서는 노상 전기도공 됨즉, 그릇할 때마다 톰캣이 재개시되다 것 게다가 2대 끝의 서버에서 서비스하고 위치하다면, 톰캣마다 세션 동기화 설정을 해야만 함 5.
2. 1. 톰캣 세션일반적으로 별딴 설정을 하지 않을 때 기본적으로 간택되는 방식이렇게 될 과우 톰캣에 세션이 갈무리되기 땜에, 2대 끝의 WAS가 구동되는 배경에서는 톰캣 성관 세션 공동를 위한 가미 설정이 소요 5. 1.
메모리 데이터베이스Redis, Memcached와 같은 메모리 데이터베이스는 B2C 서비스에서 제일 많이 고용하는 방식사실 서비스로 고용하기 위해서는 Embadded Redis와 같은 방식이 아닌, 외부 메모리 서버가 소요 이강 AWS에서 관계 서비스를 그릇/경영할 때를 생각하면, 레디스와 같은 메모리 데이터베이스를 고용하기는 부담스러움레디스와 같은 서비스(엘라스틱 캐시)에 가외로 고용료를 지불해야 하기 땜만일 나이 경영 중인 서비스가 커진다면, 고려나타내다 것으로 5. 3. 1. 데이터베이스제 WAS 성관 공무 세션을 고용할 수 있는 제일 쉬운 기법많은 설정이 소요 없지만, 결국 대수인 신청마다 데이터베이스 IO가 발생하여, 기능상 논점가 존재심상성 대수인 신청이 많이 없는 백오피스, 남아 제도 실용성에서 고용 이 계획에서는 관계 방식을 고용할 것설정이 간단하고, 고용자가 많은 서비스가 아니며, 비용 긴축을 위해서 5.
용수철framework. gradle에 나중과 같이 의지성을 등기dependencies { implementation ‘org. 용수철-session-jdbc미리 build. 2.
store-모양=jdbc 거듭 애플리케이션을 실행해 대수인을 테스트한 뒤, H2-조종탁로 접속하면, 세션을 위한 상 2개(용수철_SESSION, 용수철_SESSION_ATTRIBUTE)가 생성된 것을 볼 수 있음곧 대수인했기 땜에, 한 개의 세션이 등기되어 있는 것을 볼 수 있음 당연히 금방은 기존과 동일하게 스프링을 재시작하면 세션이 어닐링H2 근거으로 스프링이 재실행될 때 H2도 재시작되기 땜 이강 AWS로 그릇하게 되면, AWS의 데이터베이스 서비스인 RDS를 고용하게 되니, 이때부터는 세션이 풀리지 않음 . session. properties에 세션 저곳를 jdbc로 간택하도록 코드를 가미용수철. session:용수철-session-jdbc’} 그리고 application.