Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable
๐Ÿ“‚ ์Šคํ”„๋ง/๊ธฐ๋ณธ ๊ฐœ๋…

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ(Servlet Filter)

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ(Servlet Filter)
๐Ÿ“‚ ์Šคํ”„๋ง/๊ธฐ๋ณธ ๊ฐœ๋…

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ(Servlet Filter)

2023. 4. 29. 22:29

  ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ(Servlet Filter)์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ , '์š”์ฒญ ๋กœ๊ทธ ์˜ˆ์ œ'์™€ '์ธ์ฆ ์ฒดํฌ ์˜ˆ์ œ'๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

1. ๊ฐœ๋… ๐ŸŒŒ

๐Ÿ“˜ 1. ํ•„ํ„ฐ ํ๋ฆ„

  ํ•„ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์„ ๊ฐ€์ง„๋‹ค.

HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ โ†’ ์„œ๋ธ”๋ฆฟ(Dispatcher Servlet) โ†’ ์ปจํŠธ๋กค๋Ÿฌ

  ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•„ํ„ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋œ๋‹ค. ์ฆ‰, ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ํ•„ํ„ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ณ ๊ฐ์˜ ์š”์ฒญ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ์ธ์ฆ ์ฒดํฌ(๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๋“ฑ)๋“ฑ์˜ ํ–‰์œ„๋ฅผ ํ•„ํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“˜ 2. ํ•„ํ„ฐ ์ œํ•œ

  ํ•„ํ„ฐ์—์„œ๋Š” ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ๊ณผ ๊ฐ™์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ์š”์ฒญ์— ๋Œ€ํ•˜์—ฌ ํŒ๋‹จํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

(1) ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ
HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ(๋กœ๊ทธ์ธ O) โ†’ ์„œ๋ธ”๋ฆฟ โ†’ ์ปจํŠธ๋กค๋Ÿฌ
(2) ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ
HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ(๋กœ๊ทธ์ธ X)

๐Ÿ“˜ 3. ํ•„ํ„ฐ ์ฒด์ธ

  ํ•„ํ„ฐ๋Š” ์ฒด์ธ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ1 โ†’ ํ•„ํ„ฐ2 โ†’ ํ•„ํ„ฐ3 โ†’ ์„œ๋ธ”๋ฆฟ โ†’ ์ปจํŠธ๋กค๋Ÿฌ

  ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์ ์šฉํ•˜๊ณ  ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“˜ 4. ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค

public interface Filter {

    default void init(FilterConfig filterConfig) throws ServletException {}
    
    void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

    default void destroy() {}
}

  ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„ํ„ฐ๋ฅผ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

  • init()
    ํ•„ํ„ฐ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ
    ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.
  • doFilter()
    ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
    ํ•„ํ„ฐ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.
  • destroy()
    ํ•„ํ„ฐ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ
    ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.

  init()๊ณผ destroy()๋Š” default ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๊ผญ ํ•ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

2. ์š”์ฒญ ๋กœ๊ทธ ์˜ˆ์ œ ๐Ÿช

@Slf4j
public class LogFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("log filter init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        String uuid = UUID.randomUUID().toString(); // HTTP ์š”์ฒญ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ

        try{
            log.info("REQUEST [{}][{}]", uuid, requestURI);
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        } finally {
            log.info("RESPONSE [{}][{}]", uuid, requestURI);
        }
    }

    @Override
    public void destroy() {
        log.info("log filter destroy");
    }
}

  ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด HttpServletRequest๊ฐ€ ์•„๋‹Œ ServletRequest์ธ ์ด์œ ๋Š” ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” HTTP ์š”์ฒญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ request๋ฅผ HttpServletRequest๋ผ๊ณ  ๋‹ค์šด์บ์ŠคํŒ… ํ•ด์ฃผ์—ˆ๋‹ค.

  chain.doFilter(request, response)๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ ํ•„ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ ํ•„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์—†์œผ๋ฉด ์„œ๋ธ”๋ฆฟ์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๊ฑธ ์ƒ๋žตํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean logFilger() {
        FilterRegistrationBean<Filter> filterRegistrationBean
                = new FilterRegistrationBean<>();

        filterRegistrationBean.setFilter(new LogFilter()); // ๋“ฑ๋กํ•  ํ•„ํ„ฐ ์ง€์ •
        filterRegistrationBean.setOrder(1); // ์ฒด์ธ ์ˆœ์„œ ์ง€์ •
        filterRegistrationBean.addUrlPatterns("/*"); // ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  URL ํŒจํ„ด ์ง€์ •
        return filterRegistrationBean;
    }
}

  FilterRegistrationBean์„ ์ด์šฉํ•ด์„œ ๋“ฑ๋กํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

  setFilter()๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ํ•„ํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๊ณ , setOrder()๋ฅผ ์ด์šฉํ•ด์„œ ์ฒด์ธ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ , addUrlPatterns()๋ฅผ ์ด์šฉํ•ด์„œ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  URL์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

  ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด ๋กœ๊ทธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

2023-04-29T21:58:44.599+09:00 INFO 16520 --- [ main] com.filter.LogFilter : log filter init
2023-04-29T21:58:47.135+09:00 INFO 16520 --- [nio-8080-exec-1] com.filter.LogFilter : REQUEST [14e2840a-84d3-43a3-9275-f03fab226e31][/]
2023-04-29T21:58:47.661+09:00 INFO 16520 --- [nio-8080-exec-1] com.filter.LogFilter : RESPONSE [14e2840a-84d3-43a3-9275-f03fab226e31][/]
2023-04-29T21:59:05.150+09:00 INFO 16520 --- [ionShutdownHook] com.filter.LogFilter : log filter destroy

 

3. ์ธ์ฆ ์ฒดํฌ ์˜ˆ์ œ ๐ŸŒ

@Slf4j
public class LoginCheckFilter implements Filter {

    // ์ธ์ฆ ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์„ ๊ฒƒ๋“ค
    private static final String[] whitelist = {"/", "/members/add", "/login", "/logout", "/css/*"};

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        HttpServletResponse httpResponse = (HttpServletResponse) response;

        try {
            log.info("์ธ์ฆ ์ฒดํฌ ํ•„ํ„ฐ ์‹œ์ž‘ {}", requestURI);

            // ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ์ธ ๊ฒฝ์šฐ
            if (isLoginCheckPath(requestURI)) {
                log.info("์ธ์ฆ ์ฒดํฌ ๋กœ์ง ์‹คํ–‰ {}", requestURI);
                HttpSession session = httpRequest.getSession(false);

                // ์ธ์ฆ์ด ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ
                if (...) {
                    log.info("๋ฏธ์ธ์ฆ ์‚ฌ์šฉ์ž ์š”์ฒญ {}", requestURI);
                    //๋กœ๊ทธ์ธ์œผ๋กœ redirect
                    httpResponse.sendRedirect("/login?redirectURL=" + requestURI);

                    // ๋ฏธ์ธ์ฆ ์‚ฌ์šฉ์ž๋Š” ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ธฐ
                    return;
                }
            }

            // ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ๋กœ์ด๊ฑฐ๋‚˜
            // ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ
            // ๊ณ„์† ์ง„ํ–‰
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        } finally {
            log.info("์ธ์ฆ ์ฒดํฌ ํ•„ํ„ฐ ์ข…๋ฃŒ {}", requestURI);
        }
    }

    private boolean isLoginCheckPath(String requestURI) {
        return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
    }
}
@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean loginCheckFilger() {
        FilterRegistrationBean<Filter> filterRegistrationBean
                = new FilterRegistrationBean<>();

        filterRegistrationBean.setFilter(new LoginCheckFilter()); // ๋“ฑ๋กํ•  ํ•„ํ„ฐ ์ง€์ •
        filterRegistrationBean.setOrder(2); // ์ฒด์ธ ์ˆœ์„œ ์ง€์ •
        filterRegistrationBean.addUrlPatterns("/*"); // ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  URL ํŒจํ„ด ์ง€์ •
        return filterRegistrationBean;
    }
}

  'ํ™ˆ, ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, css'์™€ ๊ฐ™์€ ๊ณณ์—๋Š” ์ธ์ฆ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ whitelist๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์–ด์„œ ์ธ์ฆ ์ฒดํฌ ๋กœ์ง์—์„œ ๋ฐฐ์ œํ•ด ์ฃผ์—ˆ๋‹ค.

  ์ธ์ฆ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด login ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•˜์˜€๋Š”๋ฐ, ๋’ค์— redirectURL์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋กœ๊ทธ์ธ์„ ํ•œ ์ดํ›„ ๋‹ค์‹œ ์›๋ž˜ ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. 

 

  ์ถ”๊ฐ€์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)์™€ ๋‹ฌ๋ฆฌ ํ•„ํ„ฐ๋Š” doFilter(request, response)๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ request์™€ response๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฐธ๊ณ  ์‚ฌํ•ญ์œผ๋กœ ์•Œ์•„๋‘์ž.

 

ํ•ด๋‹น ๊ธ€์€ ๊น€์˜ํ•œ ๋‹˜์˜ '์Šคํ”„๋ง MVC 2ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ™œ์šฉ ๊ธฐ์ˆ '์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ ์Šคํ”„๋ง > ๊ธฐ๋ณธ ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] ๊ฒ€์ฆ(Validation) - BindingResult, FieldError, ObjectError  (0) 2023.05.01
์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ(Spring Interceptor)  (0) 2023.04.30
๋ฉ”์‹œ์ง€ & ๊ตญ์ œํ™” (Message & Internationalization)  (0) 2023.04.25
HTTP ์‘๋‹ต(์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ, HTTP ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ  (0) 2023.04.21
HTTP ์š”์ฒญ(ํ—ค๋”, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ  (0) 2023.04.20
  • 1. ๊ฐœ๋… ๐ŸŒŒ
  • 2. ์š”์ฒญ ๋กœ๊ทธ ์˜ˆ์ œ ๐Ÿช
  • 3. ์ธ์ฆ ์ฒดํฌ ์˜ˆ์ œ ๐ŸŒ
'๐Ÿ“‚ ์Šคํ”„๋ง/๊ธฐ๋ณธ ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring] ๊ฒ€์ฆ(Validation) - BindingResult, FieldError, ObjectError
  • ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ(Spring Interceptor)
  • ๋ฉ”์‹œ์ง€ & ๊ตญ์ œํ™” (Message & Internationalization)
  • HTTP ์‘๋‹ต(์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ, HTTP ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ
Amenable
Amenable
CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.