Day 10

์ด์ „์˜ OAuth์—์„œ๋ถ€ํ„ฐ ์ง„ํ–‰

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„ 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ฝ”๋“œ์˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค(๋‚˜์œ์ฝ”๋“œ)

๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” : ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ™์€ ์ฝ”๋“œ

์šฐ๋ฆฌ์˜์ฝ”๋“œ์—์„œ๋Š” IndexController์—์„œ์˜ ์„ธ์…˜๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ž„

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

index ๋ฉ”์†Œ๋“œ ์™ธ์˜ ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฉ”์†Œ๋“œ์—์„œ ์„ธ์…˜๊ฐ’์ด ํ•„์š”ํ•˜๋ฉด ๊ทธ ๋•Œ๋งˆ๋‹ค ์ง์ ‘ ์„ธ์…˜์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผํ•จ

โ†’ ๊ทธ๋ž˜์„œ ์ด ๋ถ€๋ถ„์„ ๋ฉ”์†Œ๋“œ ์ธ์ž๋กœ ์„ธ์…˜๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์ž

config.auth ํŒจํ‚ค์ง€์— @LoginUser ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑํ•˜์ž

โ†’์ž๋ฐ”ํŒŒ์ผ์—์„œ Annotation์„ ๋งŒ๋“œ๋Š” ๊ณณ์ด ์žˆ๋”๋ผ

src/main/java/com/kyu/book/springboot/config/auth/LoginUser

package com.kyu.book.springboot.config.auth;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
  • @Target(ElementType.PARAMETER)

    • ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ง€์ •

    • PARAMETER๋กœ ์ง€์ •ํ–ˆ์œผ๋‹ˆ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

    • ์ด ์™ธ์—๋„ ํด๋ž˜์Šค ์„ ์–ธ๋ฌธ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” TYPE ๋“ฑ์ด ์žˆ์Œ

  • @interface

    • ์ด ํŒŒ์ผ์„ ์–ด๋…ธํ…Œ์ด์…˜ ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•œ๋‹ค

    • LoginUser๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค

๋‹ค์Œ์œผ๋กœ ๊ฐ™์€ ์œ„์น˜์— LoginUserArgumentResolver๋ฅผ ์ƒ์„ฑ

โ†’HandlerMethodArgumentResolver ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

  • ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด HandlerMethodArgumentResolver์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ

src/main/java/com/kyu/book/springboot/config/auth/LoginUserArgumentResolver

package com.kyu.book.springboot.config.auth;

import com.kyu.book.springboot.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");
    }
}
  • suppertsParameter()

    • ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํŒ๋‹จ

    • ์—ฌ๊ธฐ์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— @LoginUser ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด ์žˆ๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ํด๋ž˜์Šค ํƒ€์ž…์ด SessionUser.class์ธ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜

  • resolveArgument()

    • ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

    • ์—ฌ๊ธฐ์„œ๋Š” ์„ธ์…˜์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

โ€”์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ @LoginUser๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑโ€”

์ด์ œ๋Š” LoginUserArgumentResolver๊ฐ€ ์Šคํ”„๋ง์—์„œ ์ธ์‹๋  ์ˆ˜ ์žˆ๋„๋ก WebMvcConfigurer์— ์ถ”๊ฐ€

configํŒจํ‚ค์ง€์˜ webConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์„ค์ • ์ถ”๊ฐ€

src/main/java/com/kyu/book/springbook/config/WebConfig

package com.kyu.book.springboot.config;

import com.kyu.book.springboot.config.auth.LoginUserArgumentResolver;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final LoginUserArgumentResolver loginUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
        argumentResolvers.add(loginUserArgumentResolver);
    }
}
  • HandlerMethodArgumentResolver๋Š” ํ•ญ์ƒ WebMvcConfigurer์˜ addArgumentResolvers()๋ฅผ ํ†ตํ•ด์„œ ํ•ญ์ƒ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

  • ๋‹ค๋ฅธ HandlerMethodArgumentResolver๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค

โ€”์ด๊ฑธ๋กœ ๋ชจ๋“  ์„ค์ •์ด ๋๋‚ฌ์œผ๋‹ˆ๊นŒ IndexController์˜ ์ฝ”๋“œ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ @LoginUser๋กœ ๊ฐœ์„ 

src/main/java/com/kyu/book/springboot/web/dto/IndexController

private final PostsService postsService;

@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user){
    model.addAttribute("posts", postsService.findAllDesc());
    if(user != null){
        model.addAttribute("userName", user.getName());
    }
    return "index";
}
  • @LoginUser Session user

    • ๊ธฐ์กด์— (User)httpSession.getAttribute("user")๋กœ ๊ฐ€์ ธ์˜ค๋˜ ์„ธ์…˜์ •๋ณด ๊ฐ’์„ ์ด์ œ ๊ทธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ฐ€๋Šฅ

    • ์ด์ œ๋Š” ์–ด๋Š ์ปจํŠธ๋กค๋Ÿฌ๋“ ์ง€ @LoginUser๋งŒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์„ธ์…˜์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

Last updated

Was this helpful?