!โญ๏ธ๋ชฉ์ฐจ๋ฅผ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐœ๋…์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

!โญ๏ธ๋ชฉ์ฐจ

1. Bean

Spring Bean์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ

2. Servlet

Spring MVC ์ด์ „ ๋‹จ๊ณ„์— Controller๋ฅผ ์ƒ์„ฑํ•œ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

3. MVC in Spring

Spring์—์„œ ์ฃผ๋กœ ์“ฐ๋Š” MVC ํŒจํ„ด๊ณผ ๊ด€๋ จ๋œ Annotation๋“ค ์•Œ์•„๋ณด๊ธฐ

4. Message ๊ด€๋ฆฌ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋”ฐ๋กœ propertiesํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

5. ๊ฒ€์ฆ(Validation) ๊ธฐ๋Šฅ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

6. ์„ธ์…˜(HttpSession)

HttpServletRequest์—์„œ ์ง€์›ํ•˜๋Š” HttpSession ์•Œ์•„๋ณด๊ธฐ

7. ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)

๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ ์•Œ์•„๋ณด๊ธฐ

8. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

์˜ˆ์™ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Rest API์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

9. ์ปจ๋ฒ„ํ„ฐ(Converter)์™€ ํฌ๋งทํ„ฐ(Formatter)

๋™์ผํ•œ ํƒ€์ž… ๋ณ€ํ™˜์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด์•ผ ํ•  ๋•Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

10. Multipart

Spring์—์„œ ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ํŒŒ์ผ์„ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

์›๋ณธ ๋งํฌ

33๊ฑด์˜ ํ•ญ๋ชฉ

  • 2025๋…„ 2์›” 14์ผ

    Multipart์˜ ์ •์˜ Http์š”์ฒญ์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์š”์ฒญ ๋ฐ์ดํ„ฐ์— ์žˆ๋Š” ํŒŒ์ผ์ด Multipart ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Multipart์˜ ์ข…๋ฅ˜ Content-Type์„ค๋ช…multipart/form-dataํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ์‚ฌ์šฉ (HTML ํผ์—์„œ <input type=โ€œfileโ€>์„ ์‚ฌ์šฉํ•  ๋•Œ)multipart/mixed์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉmultipart/alternative๋™์ผํ•œ ๋‚ด์šฉ์„ ์—ฌ๋Ÿฌ ํ˜•์‹(์˜ˆ: HTML, Plain Text)์œผ๋กœ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉmultipart/related๋ณธ๋ฌธ๊ณผ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ผ ๋•Œ (์˜ˆ: HTML ๋ณธ๋ฌธ๊ณผ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€) multipart/form-data ์˜ˆ์‹œ POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary ------WebKitFormBoundary Content-Disposition: form-data; name="username" john_doe ------WebKitFormBoundary Content-Disposition: form-data; name="file"; filename="image.jpg" Content-Type: image/jpeg (binary data) ------WebKitFormBoundary-- Spring์—์„œ Multipart๊ด€๋ จ ์„ค์ • 1.

  • 2025๋…„ 2์›” 13์ผ

    Formatter์˜ ์ •์˜ ์‹ค์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ƒํ™ฉ์ด ๋นˆ๋ฒˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ํŠน์ •ํ•œ ํฌ๋งท์— ๋งž์ถ”์–ด ๋ฌธ์ž๋กœ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์— ํŠนํ™”๋œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Formatter๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

  • 2025๋…„ 2์›” 13์ผ

    Converter์˜ ์ •์˜ Spring์—์„œ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ํƒ€์ž…์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด๋†“์€ ๊ฒƒ ์ด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž์ฃผ ๋ณ€ํ™˜ํ•˜๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Converter ์ƒ์„ฑ ์˜ˆ์‹œ๋กœ ip์™€ port ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด 127.0.0.1:8080๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Converter๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 9์›” 18์ผ

    Spring์—์„  ๊ธฐ๋ณธ์ ์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ฐ€๋กœ์ฑ„์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ExceptionResolver๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Spring์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ExceptionResolver๋Š” 3์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ResponseStatusExceptionResolver๋Š” ์•„๋ž˜ ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 9์›” 16์ผ

    ์˜ˆ์™ธ ๋ฐœ์ƒ ๋ฐฉ๋ฒ• ์šฐ์„  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exception ํด๋ž˜์Šค ์„ ์–ธ throw new RuntimeException("์˜ˆ์™ธ ๋ฐœ์ƒ!"); Exception ํด๋ž˜์Šค๋“ค์„ ์ƒˆ๋กœ ์„ ์–ธํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 9์›” 14์ผ

    Interceptor์˜ ์ •์˜ Interceptor๋ž€ Spring MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. Filter์™€ ์—ญํ• ์€ ๊ฐ™์ง€๋งŒ ์ ์šฉ๋˜๋Š” ์ˆœ์„œ์™€ ๋ฒ”์œ„, ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Filter์™€์˜ ์ฐจ์ด์  HTTP ์š”์ฒญ -> WAS -> ํ•„ํ„ฐ -> ์„œ๋ธ”๋ฆฟ -> ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ -> ์ปจํŠธ๋กค๋Ÿฌ ์Šคํ”„๋ง์ด ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์„ ๋ณด๋ฉด ํ•„ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ ์ „์—, ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 9์›” 14์ผ

    Filter์˜ ์ •์˜ Servlet์ด ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๊ณตํ†ต์ ์ธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์ „ ๊ณตํ†ต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ. Filter์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; public default void destroy() {} } init(): ํ•„ํ„ฐ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 29์ผ

    @SessionAttribute์˜ ์ •์˜ Spring์—์„œ Session์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ธ์…˜์„ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜์ง„ ์•Š๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ public String home( @SessionAttribute(name = "loginMember", required = false) Member loginMember, ...) { ..

  • 2024๋…„ 8์›” 29์ผ

    ์„ธ์…˜์ด๋ž€? ๋กœ๊ทธ์ธ์„ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด ์‚ฌ์šฉ์ž์˜ ID๊ฐ’ ์ž์ฒด๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•ด๋ฒ„๋ฆฌ๋ฉด ๋ณด์•ˆ์ด ์ทจ์•ฝํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์ชฝ์—์„œ ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ฟ ํ‚ค ์ €์žฅ์†Œ์™€๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅด๊ฒŒ ์„œ๋ฒ„์ชฝ์—์„œ ์ €์žฅ๋˜๋Š” Key-Valueํƒ€์ž…์˜ ์ €์žฅ๊ณต๊ฐ„์„ ์„ธ์…˜(Session) ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ID๊ฐ’์€ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ value๋กœ ์ €์žฅ์ด ๋˜๊ณ , ์ด์— ๋Œ€ํ•ด ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ๋œ Session ID๊ฐ’์„ ์ฟ ํ‚ค ์ €์žฅ์†Œ์—์„œ ์ €์žฅ๋˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์ฟ ํ‚ค ์ €์žฅ์†Œ์—๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    ์ •์˜ ์„œ๋ธ”๋ฆฟ์€ ์›น ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋กœ, ์›น ์„œ๋ฒ„ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์‹œ ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ ์ƒ์„ฑ ์˜ˆ์‹œ HttpServlet ํด๋ž˜์Šค๋ฅผ extendsํ•˜์—ฌ service()ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    Spring์˜ Model-View-Controller(MVC) ์ „์ฒด ๊ตฌ์กฐ ๋™์ž‘ ์ˆœ์„œ ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ: ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ํ†ตํ•ด ์š”์ฒญ URL์— ๋งคํ•‘๋œ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๋ฅผ ์กฐํšŒํ•œ๋‹ค. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ: ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰: ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    Spring์˜ Message๊ด€๋ฆฌ ์ •์˜ Spring ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ณณ์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ๊ตฌ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ๊ตญ๊ฐ€๋ณ„๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์„ค์ • Spring์—์„  ResourceBundleMessageSource๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    HttpServletResponse์˜ ์ •์˜ Servlet์—์„œ HTTP ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•˜๊ณ , ์‘๋‹ต ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP ์‘๋‹ต ์„ค์ • 1. ์ƒํƒœ ์ฝ”๋“œ ์„ค์ • response.setStatus(HttpServletResponse.SC_OK); // ์ •์ƒ ์ƒํƒœ์ฝ”๋“œ(200)์„ ์„ค์ • 2.

  • 2024๋…„ 8์›” 21์ผ

    HttpServletRequest์˜ ์ •์˜ Servlet์€ ๊ฐœ๋ฐœ์ž๊ฐ€ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์ž ๋Œ€์‹ ์— HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ HttpServletRequest ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ์กฐํšŒ http://localhost:8080/hello?username=hello์— ์ ‘์†ํ•œ ์ƒํ™ฉ 1.

  • 2024๋…„ 8์›” 21์ผ

    BindingResult์˜ ์ •์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ฃผ์˜์‚ฌํ•ญ Controller์˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๋Š” BindingResult๋Š” @ModelAttribute์ด ๋ถ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ”๋กœ ๋’ค์— ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    Bean Validation์˜ ์ •์˜ Bean Validation 2.0(JSR-380)์ด๋ผ๋Š” ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ๊ฒ€์ฆ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ž‘์—… ์˜์กด๊ด€๊ณ„ ์ถ”๊ฐ€ Bean Validation์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์šฐ์„  build.gradle์—์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 21์ผ

    Bean์˜ ์ •์˜ Spring IoC(Inversion of Control) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ ๋ฐ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ ๋ฐฉ๋ฒ• 1. XML์„ ํ†ตํ•œ ์„ ์–ธ <beans> <bean id="myBean" class="com.example.MyClass"/> </beans> 2.

  • 2024๋…„ 8์›” 21์ผ

    ApplicationContext์˜ ์ •์˜ Spring Bean์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” Spring Container์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ธ BeanFactory๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ƒ์†๋ฐ›์•„์„œ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.๊ฑฐ๊ธฐ๋‹ค๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ํŽธ๋ฆฌํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋” ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค ...

  • 2024๋…„ 8์›” 21์ผ

    ๊ฒ€์ฆ ๊ธฐ๋Šฅ์˜ ์ •์˜ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์•ˆ์ •์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ๊ด€๋ฆฌ์™€ ์ถ”์  1. BindingResult ThymeLeaf์—์„œ ๊ฒ€์ฆ ์˜ค๋ฅ˜ ํ‘œํ˜„ ThymeLeaf์˜ ๊ฒ€์ฆ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ฐธ๊ณ  (๊ด€๋ จ ๊ธ€ ์ค€๋น„ ์ค‘) Message ๊ธฐ๋Šฅ ์‘์šฉ Message ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 20์ผ

    @ResponseBody์˜ ์ •์˜ Controller์˜ ๋ฉ”์„œ๋“œ๊ฐ€ returnํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๋Š” Annotation ๋‹จ์ˆœ ํ…์ŠคํŠธ ์‘๋‹ต @ResponseBody @GetMapping("/response-body-string") public String responseBody() ...

  • 2024๋…„ 8์›” 20์ผ

    @Validated์˜ ์ •์˜ ๊ฒ€์ฆ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” AnnotationWebDataBinder ์— ๋“ฑ๋กํ•œ ๊ฒ€์ฆ๊ธฐ๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ๊ธฐ ์„ ์ • ๋ฐฉ๋ฒ• ์—ฌ๋Ÿฌ ๊ฒ€์ฆ๊ธฐ ์ค‘ ์–ด๋–ค ๊ฒ€์ฆ๊ธฐ๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋  ์ง€๋Š” supports()์—์„œ ์ง€์ •ํ•œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ ๊ฒ€์ฆ๊ธฐ(๋ณ€๋™ ์—†์Œ) @Component public class ItemValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return Item.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { ..

  • 2024๋…„ 8์›” 20์ผ

    @RequestParam์˜ ์ •์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ ์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Annotation ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• http://localhost:8080/request-param?username=hello&age=20 ๊ฒฝ๋กœ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ @ResponseBody @RequestMapping("/request-param") ...

  • 2024๋…„ 8์›” 20์ผ

    @RequestMapping์˜ ์ •์˜ Spring์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ์–ด๋Œ‘ํ„ฐ ์‚ฌ์šฉ ์˜ˆ์‹œ @Controller public class Controller { @RequestMapping("/hello/form", method = RequestMethod.GET) ...

  • 2024๋…„ 8์›” 20์ผ

    @RequestBody์˜ ์ •์˜ HTTP ์š”์ฒญ์˜ Body๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ทธ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ž๋™์œผ๋กœ ์›ํ•˜๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์—ญํ•  JSON๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ฐ์ฒด ์ƒ์„ฑ @Data public class HelloData { private String username; ...

  • 2024๋…„ 8์›” 20์ผ

    @Qualifier์˜ ์ •์˜ ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ Bean๊ณผ ํƒ€์ž…์ด ๋™์ผํ•œ ๋‹ค๋ฅธ Bean ์ด ํ•œ ๊ฐœ ์ด์ƒ ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.์ด๋Ÿด ๋•Œ ์›ํ•˜๋Š” ๋นˆ์—๊ฒŒ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ณ„๋ช…์„ @Qualifier๋กœ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ ๋นˆ ๋“ฑ๋ก @Component @Qualifier("mainDiscountPolicy") // public class RateDiscountPolicy implements DiscountPolicy { } ์˜์กด์„ฑ ์ฃผ์ž… @Autowired public OrderServiceImpl( MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy ) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } ์ฝ”๋“œ ์„ค๋ช… ๋นˆ ๋“ฑ๋กํ•  ๋•Œ ํ•ด๋‹น ๋นˆ์— @Qualifier๋ฅผ ํ†ตํ•ด ๋ณ„๋ช…์„ ์ง€์–ด์ฃผ๊ณ , ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ @Qualifier๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์–ด๋†“์€ ๋ณ„๋ช…์„ ๋„ฃ์–ด ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 20์ผ

    @Primary์˜ ์ •์˜ ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ Bean๊ณผ ํƒ€์ž…์ด ๋™์ผํ•œ ๋‹ค๋ฅธ Bean ์ด ํ•œ ๊ฐœ ์ด์ƒ ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.์ด๋Ÿด ๋•Œ ์šฐ์„ ์ ์œผ๋กœ ์กฐํšŒํ•  ๋นˆ์„ @Primary๋ฅผ ํ†ตํ•ด ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ ๋นˆ ๋“ฑ๋ก @Component @Primary public class RateDiscountPolicy implements DiscountPolicy { } ์˜์กด์„ฑ ์ฃผ์ž… @Autowired public OrderServiceImpl( MemberRepository memberRepository, DiscountPolicy discountPolicy ) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } ์ฝ”๋“œ ์„ค๋ช… ๋นˆ ๋“ฑ๋กํ•  ๋•Œ ์šฐ์„ ์ ์œผ๋กœ ์„ ์–ธํ•  ๋นˆ์—๊ฒŒ @Primary ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ณ„ ๋‹ค๋ฅธ ์ž‘์—… ์—†์ด ํ•ด๋‹น ํƒ€์ž…์˜ ๋นˆ์„ ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋ฉด @Primary๋ฅผ ์ ์šฉํ•œ RateDiscoutPolicyํƒ€์ž…์˜ ๋นˆ์ด ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 20์ผ

    @ModelAttribute์˜ ์ •์˜ @RequestParam์œผ๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ฐ›์•„์˜ค๊ธฐ ์‰ฝ์ง€ ์•Š์€ ์ƒํ™ฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.์ด๋Ÿด ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์˜ ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ๋ฒ•(setXXX)์œผ๋กœ ์•Œ์•„์„œ ์ž…๋ ฅํ•˜์—ฌ ๊ฐ์ฒด๋กœ ๊ฐ’๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฐ์ฒด ์ƒ์„ฑ @Data public class HelloData { private String username; private int age; } ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• @ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV1(@ModelAttribute HelloData helloData) { log.info("username={}, age={}", helloData.getUsername(), helloData.getAge()); return "ok"; }.

  • 2024๋…„ 8์›” 20์ผ

    @ComponentScan์˜ ์ •์˜ ์ง์ ‘ xml์ด๋‚˜ java์ฝ”๋“œ๋กœ ์„ค์ •ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” Annotation @Autowired๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ค์ •ํ–ˆ๋˜ ์˜์กด๊ด€๊ณ„๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ ์ฑ„๋กœ Bean์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค ...

  • 2024๋…„ 8์›” 20์ผ

    @Configuration์˜ ์ •์˜ ๋”ฐ๋กœ ๋นˆ ์ •์˜์šฉ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ๋นˆ์„ ์ •์˜ํ•˜๊ณ  ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹ ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ @Bean ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Bean์„ ์ •์˜ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ @Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } } ์ฝ”๋“œ ์„ค๋ช… memberRepository, discoutPolicy, memberService, orderService ์ด 4๊ฐœ์˜ Bean์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • 2024๋…„ 8์›” 20์ผ

    @Autowired์˜ ์ •์˜ Annotation์„ ํ†ตํ•ด Bean์œผ๋กœ ์ง€์ •๋œ ํด๋ž˜์Šค๋“ค์˜ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Annotation ์‚ฌ์šฉ ์˜ˆ์‹œ 1. ์ƒ์„ฑ์ž ์ฃผ์ž… @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } } ์ฝ”๋“œ ์„ค๋ช… OrderServiceImpl์ƒ์„ฑ์ž์— @Autowired๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ OrderServiceImpl์ด ์ƒ์„ฑ๋˜๋ฉด์„œ ๋™์‹œ์— memberRepository์™€ discountPolicy์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์Œ 2.

  • 2024๋…„ 8์›” 20์ผ

    1. Bean Spring Bean์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ 2. Servlet Spring MVC ์ด์ „ ๋‹จ๊ณ„์— Controller๋ฅผ ์ƒ์„ฑํ•œ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ 3. MVC in Spring Spring์—์„œ ์ฃผ๋กœ ์“ฐ๋Š” MVC ํŒจํ„ด๊ณผ ๊ด€๋ จ๋œ Annotation๋“ค ์•Œ์•„๋ณด๊ธฐ 4. Message ๊ด€๋ฆฌ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋”ฐ๋กœ propertiesํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ 5.