# Spring / Web ์Šค์ฝ”ํ”„
Study Repository

Spring / Web ์Šค์ฝ”ํ”„

by rlaehddnd0422

์›น ์Šค์ฝ”ํ”„

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์„ค๋ช…ํ•œ ์‹ฑ๊ธ€ํ†ค, ํ”„๋กœํ† ํƒ€์ž… ์™ธ์— ํ•œ๊ฐ€์ง€ ์Šค์ฝ”ํ”„๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์›น ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์›น ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

์›น ์Šค์ฝ”ํ”„ ํŠน์ง•

1. ์›น ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘

2. ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์Šคํ”„๋ง์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ข…๋ฃŒ์‹œ์ ๊นŒ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

์›น ์Šค์ฝ”ํ”„ ์ข…๋ฅ˜

1. request : HTTP ์š”์ฒญ์ด ํ•˜๋‚˜ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„, ๊ฐ HTTP ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋นˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋œ๋‹ค.

2. session : HTTP Session๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„

3. application : ServletContext์™€ ๋™์ผํ•œ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„

4. websocket : ์›น ์†Œ์ผ“๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„

 

์ด ํฌ์ŠคํŒ…์—์„œ๋Š” request์— ๋Œ€ํ•œ ์Šค์ฝ”ํ”„๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

request scope ์˜ˆ์‹œ ๊ทธ๋ฆผ

request scope๋Š” HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋งˆ๋‹ค ๋นˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

 

๋™์‹œ์— ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์ด ์˜ค๋ฉด ์ •ํ™•ํžˆ ์–ด๋–ค ์š”์ฒญ์ด ๋‚จ๊ธด ๋กœ๊ทธ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ๋ฅผ request scope๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ A๊ฐ€ http ์š”์ฒญ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ,

[UUID] request scope bean created

[UUID] [requestURL] controller test

[UUID] [requestURL] service id = testId

[UUID] request scope bean closed

์™€ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ UUID๋Š” universally unique identifier๋กœ ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ  ์•„์ด๋””๋กœ ์œ ์ €๊ฐ„ ๊ฒน์น ์ผ์ด ์—†๋‹ค๊ณ ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์šฐ์„  Controller์™€ Service์—์„œ Client ์ „์šฉ request scope๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ Logger๋ฅผ ๋งŒ๋“ค์–ด์•ผ๊ฒ ์ฃ .

package hello.core.common;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.UUID;

@Component
@Scope(value = "request")
public class MyLogger {

    private String uuid;
    private String requestURL;

    public void setRequestURL(String requestURL) {
        this.requestURL = requestURL;
    }

    public void log(String msg)
    {
        System.out.println("["+uuid+"]"+"["+requestURL+ "] "+ msg );
    }

    @PostConstruct
    public void init()
    {
        uuid = UUID.randomUUID().toString();
        System.out.println("["+uuid+"] request scope bean create : " + this);

    }

    @PreDestroy
    public void close()
    {
        System.out.println("["+uuid+"] request scope bean close : " + this);
        System.out.println();
    }
}
  • request Scope์ด๊ธฐ ๋•Œ๋ฌธ์— @Scope(value="request")๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด @Component๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ logger๋Š” ๊ณ ์œ ์˜ uuid์™€ requestURL๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— privateํ•˜๊ฒŒ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • logger๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” log ๋ฉ”์†Œ๋“œ๋Š” ์ž์‹ ์˜ uuid์™€ requestURL์™€ msg๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ @PostConstruct ์ดˆ๊ธฐํ™” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ uuid๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ €์žฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์†Œ๋ฉธ๋˜๋Š” ์‹œ์ ์— @ProDestroy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.
  • requestURL์€ ์ด ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์—์„œ ์•Œ ์ˆ˜ ์—†์ฃ ? ์š”์ฒญ์ด ์–ด๋Š URL์—์„œ ๋“ค์–ด์˜ค๋Š”์ง€๋Š” ๋™์ ์œผ๋กœ ์ •ํ•ด์ง€๋‹ˆ๊นŒ์š”. ๊ทธ๋ž˜์„œ setter ์ฃผ์ž…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ Controller์™€ Service๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  Controller์ž…๋‹ˆ๋‹ค.

package hello.core.web;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequiredArgsConstructor
public class LogDemoController {
    private final LogDemoService logDemoService;
    private final MyLogger logger;
    
    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request)
    {
        String requestURL = request.getRequestURL().toString();
        logger.setRequestURL(requestURL);
        logger.log("controller test");
        logDemoService.logic("testID");
        return "OK";
    }
}

 

Controller๋Š” ๊ทธ๋ฆผ์€ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Service์™€ Logger์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„  final์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด์ฃผ๋Š” @RequiredArgsConstructor๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

@RequestMapping์„ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ๋ฐ›์„ url์„ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

@ResponseBody

ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ request ๋ฉ”์‹œ์ง€๋ผ๊ณ  ํ•˜๊ณ  

์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ response ๋ฉ”์‹œ์ง€๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, log-demo URL ์š”์ฒญ์ด ์˜ค๋ฉด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ logDemo ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ดํ˜•ํƒœ์ธ String์„ ๋ฆฌํ„ดํ•ด์ค๋‹ˆ๋‹ค.

 

logDemo method

- HttpServletRequest๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ URL์„ ๋ฐ›์€ ํ›„ requestURL๊ฐ’์„ logger์— ์ €์žฅํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

 

Service

package hello.core.web;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LogDemoService {

    private final MyLogger logger;
    public void logic(String testID) {
        logger.log("service id = " + testID);
    }
}

 

์„œ๋น„์Šค์—์„œ๋Š” ์˜ค์ง Logger์—๊ฒŒ๋งŒ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Service ๋กœ์ง์ž„์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด @Service ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋“ฑ๋กํ–ˆ๊ณ , @Service ์–ด๋…ธํ…Œ์ด์…˜์„ ์“ฐ๋ฉด ์ปดํฌ๋„ŒํŠธ๋กœ ์ž๋™ ๋“ฑ๋ก์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ํ•ด๋ณด๋ฉด ๊ธฐ๋Œ€์™€ ๋‹ค๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Error creating bean with name 'myLogger': Scope 'request' is not active for the
  current thread; consider defining a scoped proxy for this bean if you intend to
  refer to it from a singleton;

request๊ฐ€ ํ™œ์„ฑํ™” ๋˜์žˆ์ง€์•Š๋‹ค.. ํ”„๋ก์‹œ๋ฅผ ๊ณ ๋ คํ•ด๋ผ... ๋งŒ์•ฝ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ๋ถ€ํ„ฐ ์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ.. 

 

request์š”์ฒญ์ด ์‹ค์ œ๋กœ ๋“ค์–ด์™€์•ผ ๋นˆ์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ์‹ค์ œ์š”์ฒญ์ด ์—†์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•ž์—์„œ ๋ฐฐ์šด Provider๋ฅผ ์‚ฌ์šฉํ•ด์„œ request๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ ?

๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Controller

package hello.core.web;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequiredArgsConstructor
public class LogDemoController {
    private final LogDemoService logDemoService;
    private final ObjectProvider<MyLogger> myloggerProvider;

    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request)
    {
        String requestURL = request.getRequestURL().toString();
        MyLogger logger = myloggerProvider.getObject();
        logger.setRequestURL(requestURL);
        logger.log("controller test");
        logDemoService.logic("testID");
        return "OK";
    }
}

 

Service

package hello.core.web;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LogDemoService {
    private final ObjectProvider<MyLogger> myloggerProvider;
    public void logic(String testID) {
        MyLogger logger = myloggerProvider.getObject();
        logger.log("service id = " + testID);
    }
}

 

์ž ์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด

 

๋กœ๊ทธ๊ฐ€ ๋‚จ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

> ObjectProvider ๋•๋ถ„์— ObjectProvider.getObject()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ๊นŒ์ง€ request scope ๋นˆ์˜ ์ƒ์„ฑ์„ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

> ๋˜ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์—๋Š” HTTP์š”์ฒญ์ด ์ง„ํ–‰์ค‘์ด๋ฏ€๋กœ request scope ๋นˆ ์ƒ์„ฑ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

> ObjectProvider.getObject()๋ฅผ LogDemoController, LogDemoService์—์„œ ๊ฐ๊ฐ ํ•œ๋ฒˆ์”ฉ ๋”ฐ๋กœ ํ˜ธ์ถœํ•ด๋„ ๊ฐ™์€ HTTP์š”์ฒญ์ด๋ฉด ๊ฐ™์€ ์Šคํ”„๋ง ๋นˆ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

 

์ด ๋ฐฉ๋ฒ• ์™ธ์—๋„ ํ”„๋ก์‹œ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋Š”๋ฐ ํ”„๋ก์‹œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ”„๋ก์‹œ ๋ฐฉ์‹

์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด 

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {

MyLogger ํด๋ž˜์Šค์— Scope ์–ด๋…ธํ…Œ์ด์…˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ proxyMode๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ ์šฉ ๋Œ€์ƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋ฉด TARGET_CLASS

์ ์šฉ ๋Œ€์ƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฉด INTERFACES๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MyLogger์˜ ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ  HTTP request์™€ ์ƒ๊ด€์—†์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๋นˆ์— ๋ฏธ๋ฆฌ ์ฃผ์ž…ํ•ด ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

+ Service, Controller ๋‹จ๊ณ„์˜ ObjectProvider๋Š” ์›๋ž˜ MyLogger๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์‹คํ–‰ํ•ด๋ณด๋ฉด ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ”„๋ก์‹œ ๋™์ž‘ ์›๋ฆฌ

 

@Scope์˜ proxyMode = ScopedProxyMode.TARGET_CLASS ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ MyLogger๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

Mylogger.getClass()๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ˆœ์ˆ˜ MyLogger ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ EnhancerBySpringCGLIB๋ผ๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋Œ€์‹  ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โ–ถ๏ธŽ ์ด๋ ‡๊ฒŒ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜๊ณ , ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋„ ์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” request๊ฐ€ ์˜ค๋ฉด ๊ทธ ๋•Œ ๋‚ด๋ถ€์—์„œ ์ง„์งœ ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ์œ„์ž„ ๋กœ์ง์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค!

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์— ์ง„์งœ logger๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์–ด์„œ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ logger.logic()์„ ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ์‹ค ํ‘œ๋ฉด์ƒ์œผ๋กœ๋Š” ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด์ง€๋งŒ,

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ request scope์˜ ์ง„์งœ logger.logic()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

+ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์›๋ณธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ์‚ฌ์‹ค ์›๋ณธ์ธ์ง€ ์•„๋‹Œ์ง€๋„ ๋ชจ๋ฅด๊ฒŒ, ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(๋‹คํ˜•์„ฑ)

 

๋™์ž‘ ์ •๋ฆฌ

  • CGLIB๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚ด ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์ž…ํ•œ๋‹ค.
  • ์‹ค์ œ ์š”์ฒญ์ด ์˜ค๋ฉด ์‹ค์ œ ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ์œ„์ž„ ๋กœ์ง์ด ๋“ค์–ด์žˆ๋‹ค.
  • ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ request scope์™€ ๊ด€๊ณ„๊ฐ€ ์—†๊ณ , ๊ทธ๋ƒฅ ๊ฐ€์งœ์ž„. ๋‚ด๋ถ€์— ๋‹จ์ˆœ ์œ„์ž„ ๋กœ์ง๋งŒ ์žˆ๊ณ  ์‹ฑ๊ธ€ํ†ค์ฒ˜๋Ÿผ ๋™์ž‘.

ํŠน์ง• ์ •๋ฆฌ

  • ํ”„๋ก์‹œ ๊ฐ์ฒด ๋•๋ถ„์— ํด๋ผ์ด์–ธํŠธ๋Š” ๋งˆ์น˜ ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ์‚ฌ์šฉํ•˜๋“ฏ ํŽธํ•˜๊ฒŒ request scope๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  • Provider๋ฅผ ์‚ฌ์šฉํ•˜๋˜, ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์ง„์งœ ๊ฐ์ฒด ์กฐํšŒ๋ฅผ ๊ผญ ํ•„์š”ํ•œ ์‹œ์ ๊นŒ์ง€ ์ง€์—ฐ์ฒ˜๋ฆฌ ํ•œ๋‹ค๋Š” ์ !
  • ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ • ๋ณ€๊ฒฝ ๋งŒ์œผ๋กœ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ -> ๋‹คํ˜•์„ฑ๊ณผ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€์ง€๋Š” ํฐ ์žฅ์ .
  • ์›น ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹ˆ์—ฌ๋„ ํ”„๋ก์‹œ๋Š” ์‚ฌ์šฉ๊ฐ€๋Šฅ.

์ฃผ์˜์ 

  • ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.
  • ์ด๋Ÿฐ ํŠน๋ณ„ํ•œ scope๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ตœ์†Œํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž. ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.

<์ฐธ๊ณ ์ž๋ฃŒ>

https://mungto.tistory.com/436

 

[Spring] @RequestMapping์ด๋ž€?

์šฐ๋ฆฌ๋Š” ํŠน์ • uri๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด Controller์—์„œ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜๋ฅผ ํ•œ๋‹ค. ์ด๋•Œ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํŠน์ • ๋ฉ”์„œ๋“œ์™€ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด @RequestMapping์ด๋‹ค. @RequestMapping์—์„œ ๊ฐ€์žฅ

mungto.tistory.com

 

https://cheershennah.tistory.com/179

 

[Spring] @RequestBody / @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜ ์ด๋ž€?

์Šคํ”„๋ง์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ @RequestBody , @ResponseBody๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ด ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋น„๋™๊ธฐ ํ†ต์‹  ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ํ†ต

cheershennah.tistory.com

 

 

 

 

 

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ