๋ฐ˜์‘ํ˜•
REST & API
  • REST : HTTP URL ๋กœ ์„œ๋ฒ„์˜ ์ž์›(resource)์„ ๋ช…์‹œํ•˜๊ณ , HTTP ๋ฉ”์„œ๋“œ๋กœ ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•ด CRUDํ•˜๋Š”๊ฒƒ
  • API : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ์ž์›์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„์— ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค 

 

PUT / PATCH ์ฐจ์ด
  • PUT: ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ์ƒˆ ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝ. ๋งŒ์•ฝ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ! (requestBody ์— ์ „์ฒด ์š”์ฒญ๊ฐ’์„!)
  • PATCH: ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋งŒ ์ƒˆ ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝ (requestBody ์— ์ผ๋ถ€ ์š”์ฒญ๊ฐ’์„!)

 

HTTP ์ƒํƒœ
  • 1XX : ์š”์ฒญ์ด ์ˆ˜์‹ ๋ผ ์ฒ˜๋ฆฌ ์ค‘
  • 2XX : ์„ฑ๊ณต (์ •์ƒ)
  • 3XX : ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ ค๋ฉด ์ถ”๊ฐ€ ํ–‰๋™์ด ํ•„์š”ํ•จ (๋ฆฌ๋‹ค์ด๋ ‰ํŠธ..)
  • 4XX : ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์ž˜๋ชป๋˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ
  • 5XX : ์„œ๋ฒ„ ๋‚ด๋ถ€์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ!

 

RequestBody (์š”์ฒญ ๋ฉ”์„ธ์ง€)
  • ์š”์ฒญ๋ผ์ธ: method type: POST, PATCH.., url..
  • ํ—ค๋”: content-type..host..
  • ๋ณธ๋ฌธ: json 

 

ResponseBody (์‘๋‹ต ๋ฉ”์„ธ์ง€)
  • ์ƒํƒœ๋ผ์ธ: 200..201..
  • ํ—ค๋”: content-type...
  • ๋ณธ๋ฌธ: json
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋กœ๊น… (logging)

์‹œ์Šคํ…œ์ด ์ž‘๋™ํ•  ๋•Œ ๋‹น์‹œ์˜ ์ƒํƒœ์™€ ์ž‘๋™ ์ •๋ณด๋ฅผ ๊ธฐ๋ก 

 

๋กœ๊น…๋‹จ๊ณ„
๋ช…์นญ ์„ค๋ช…
TRACE 1๋‹จ๊ณ„ - DEBUG ๋ ˆ๋ฒจ๋ณด๋‹ค ์ƒ์„ธํ•œ ์ •๋ณด
DEBUG 2๋‹จ๊ณ„ - ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ธ๋ถ€ ์ •๋ณด
INFO 3๋‹จ๊ณ„ - ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆœ์กฐ๋กœ์šด ์ง„ํ–‰ ์ •๋ณด
WARN 4๋‹จ๊ณ„ - ์ž ์žฌ์ ์œผ๋กœ ์œ ํ•ดํ•œ ์ƒํ™ฉ ์ •๋ณด
ERROR 5๋‹จ๊ณ„ - ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋„์˜ ์˜ค๋ฅ˜ ์ •๋ณด
FATAL 6๋‹จ๊ณ„ - ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋  ๋งŒํ•œ ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜ ์ •๋ณด
OFF 7๋‹จ๊ณ„ - ๋กœ๊น… ๊ธฐ๋Šฅ ํ•ด์ œ 

 

JPA ๋ฐ ๋กœ๊น… ๊ด€๋ จ properties ์„ค์ • 
-- ํ”„๋กœ์ ํŠธ ๋‚ด resources > application.properties (or yaml)

server.servlet.encoding.force = true
spring.h2.console.enable=true
spring.jpa.defer-datasource-initialization=true

# JPA ๋กœ๊น… ์„ค์ •
logging.level.hibernate.SQL=DEBUG

# ์ฟผ๋ฆฌ ์ค„๋ฐ”๊ฟˆ
spring.jpa.properties.hibernate.format_sql=true

# ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’ ๋ณด์—ฌ์ฃผ๊ธฐ
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

# ์œ ๋‹ˆํฌ URL ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ
spring.datasource.generate-unique-name=false

# ๊ณ ์ • URL ์„ค์ •
spring.datasource.url=jdbc:h2:mem:testdb

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋งํฌ (Link)

 ๋ฏธ๋ฆฌ ์ •ํ•ด ๋†“์€ ์š”์ฒญ์„ ๊ฐ„ํŽธํžˆ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ (ํŽ˜์ด์ง€์ด๋™!)
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งํฌ๋ฅผ ํ†ตํ•ด ์–ด๋Š ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒ ๋‹ค๊ณ  ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ต!

 

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (Redirect)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งํฌ๋ฅผ ํ†ตํ•ด ์–ด๋Š ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒ ๋‹ค๊ณ  ์š”์ฒญํ•˜๋ฉด,
์„œ๋ฒ„๋Š” ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋ฅผ 
์‘๋‹ต ํ•˜์ง€ ์•Š๊ณ  ์žฌ์š”์ฒญํ•˜๋ผ๋Š” ํšŒ์‹ ์„ ๋ณด๋ƒ„ (์žฌ์š”์ฒญ)
๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(์žฌ์š”์ฒญ)
์„ ์ง€์‹œ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์ฃผ์†Œ๋กœ ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๋Š” ์ด์—๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต

ํด๋ผ์ด์–ธํŠธ ๋งํฌ ์ด๋™ ์š”์ฒญ → ์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ์‘๋‹ต → ํด๋ผ์ด์–ธํŠธ๋Š” ์žฌ์š”์ฒญ ์ฃผ์†Œ๋กœ ๋‹ค์‹œ ์š”์ฒญ  → ์„œ๋ฒ„์‘๋‹ต

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋กฌ๋ณต (Lombok)

• ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•ด ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (@Data)
    → https://projectlombok.org/features/Data 

 

@Data

 

projectlombok.org

    → ๊ผญ ํ•„์š”ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. (@Data ์ง€์–‘ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰)

๋กœ๋”ฉ ๊ธฐ๋Šฅ ์ง€์› (@Slf4j)

 

๋ฆฌํŒฉํ„ฐ๋ง

 ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์—๋Š” ๋ณ€ํ•จ์—†์ด ๊ตฌ์กฐ ๋ฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
ํผ๋ฐ์ดํ„ฐ (form data)

• <form> ํƒœ๊ทธ์— ์‹ค๋ ค ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ. ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ›์Œ(=DTO)
DTO(Data Transfer Object) ์„ ์ง€์ง€๊ณ  ๋ณถ์•„ DB ์— ์ €์žฅ

 

Database & JPA

 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฐฝ๊ณ  (DB)
 DB๋Š” ์ž๋ฐ”์–ธ์–ด๋ฅผ ๋ชจ๋ฆ„! DB๋Š” SQL(Structured Query Languate) ๋งŒ ์•Œ๊ณ ์žˆ์Œ.
์ž๋ฐ”์—์„œ DB์— ๋ฐ์ดํ„ฐ ๊ธฐ๋ก์„ ํ•˜๊ธฐ์œ„ํ•œ ์ˆ˜๋‹จ์ค‘์— ํ•˜๋‚˜๋กœ JPA๊ฐ€ ์žˆ์Œ 
    → JPA(Java Persistence API) ์„ ํ†ตํ•ด ์ž๋ฐ”์–ธ์–ด๋กœ DB์— ๋ช…๋ น์„ ๋‚ด๋ฆผ!
    → ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ
    → JPA ๋Š” entity, repository ๊ฐ€ ์žˆ์Œ

 

์‹ค์Šต๊ด€๋ จ

1. H2 DB์— ์›น ์ฝ˜์†”๋กœ ์ ‘๊ทผ ํ—ˆ์šฉํ•˜๋„๋ก ํ•จ (application.yaml)

spring.h2.console.enabled=true

2. h2 db ์ ‘์† ๊ด€๋ จ
→ ์ธํ…”๋ฆฌ์ œ์ด > debug ์ฝ˜์†” > jdbc: ๊ฒ€์ƒ‰ ํ›„, jdbc url ์ •๋ณด ์ฐพ์•„ localhost:8080/h2-console ๋‚ด์˜ JDBC URL ์— ๊ธฐ์ž…

์„œ๋ฒ„ ์‹คํ–‰ํ• ๋•Œ๋งˆ๋‹ค JDBC URL์€ ๋ฐ”๋€œ

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋ทฐํ…œํ”Œ๋ฆฟ (View Template)

• ํ™”๋ฉด์„ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ์ˆ 
 ์›นํŽ˜์ด์ง€(View) ์„ ํ•˜๋‚˜์˜ ํ‹€(Template) ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ๋ณ€์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ๋ณด์—ฌ์คŒ โ“
    → ์ •๋ณด์„ฑ์˜ ๋ฐ์ดํ„ฐ(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ •๋ณด) ๋“ค์„ ์œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค๋Š” ๋‚ด์šฉ
• mustache
     ๋ทฐํ…œํ”Œ๋ฆฟ ๋งŒ๋“œ๋Š” ๋„๊ตฌ (ํ…œํ”Œ๋ฆฟ ์—”์ง„)
     src > main > resources > templates ์— ์œ„์น˜
     ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์—์„œ mustache ํŒŒ์ผ๋ช…์„ return ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ์•Œ์•„์„œ mustache ํŒŒ์ผ์„ ์ฐพ์•„ ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•จ!

       


     ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€ ํ•„์š” 
 ๊ทธ์™ธ์—๋„ Thymeleaf..JSP ๋“ฑ์ด ์žˆ๋‹ค.ใ…Žใ…Žใ…Ž

 

MVC ํŒจํ„ด 

 Model : ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ!

 View : ํ™”๋ฉด์— ๋ณด์—ฌ์คŒ!

 Controller : ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ฐ›์Œ!

 

์‹ค์Šต๊ด€๋ จ

1. html ํŒŒ์ผ ๋‚ด์—์„œ ํ•œ๊ธ€์ด ๊นจ์ง€๋Š” ๊ฒฝ์šฐ, application.properties ํŒŒ์ผ ๋‚ด์— ์•„๋ž˜์˜ ๋‚ด์šฉ ์ถ”๊ฐ€ ํ•„์š” 

server.servlet.encoding.force=true

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๊ฐ์ฒด์ง€ํ–ฅ์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

 1970๋…„๋Œ€ ์ด์ „์—๋Š” ์„ค๊ณ„์—†์ด ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰
    → ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ค‘๋ณต์ฝ”๋“œ ์ฆ๊ฐ€, ์œ ์ง€๋ณด์ˆ˜์˜ ์–ด๋ ค์›€ ๋ฐœ์ƒ์œผ๋กœ ์‹ ๋ขฐ๋„ ๋ฐ”๋‹ฅ ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๋“ฑ์˜ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋จ

 1970๋…„๋Œ€ ์ดํ›„, ํ”„๋กœ๊ทธ๋žจ์„ ์ชผ๊ฐœ์–ด ๊ฐœ๋ฐœํ•˜๋Š” ๊ตฌ์กฐ์  ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์‚ฌ์šฉ (๋ถ„์„ - ์„ค๊ณ„ - ๊ฐœ๋ฐœ - ํ…Œ์ŠคํŠธ)
    → ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ช…ํ™•ํ•˜๊ณ  ๋ณ€ํ™”๊ฐ€ ๋งŽ์ด ์•Š์€ ํ™˜๊ฒฝ์—์„œ๋Š” ํšจ์œจ์ ์ด๋‚˜, ์ƒ๋ช…์ฃผ๊ธฐ ๊ฐ ๋‹จ๊ณ„๋ณ„(ex. ๋ฌผํ’ˆ๊ตฌ๋งค..๋ฌผํ’ˆ์กฐํšŒ..๋ฌผํ’ˆ์‚ญ์ œ..)๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๊ณ , ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ๋“ค์€ ๋ฐ์ดํ„ฐ์™€ ๋ณต์žกํ•˜์—ฌ ์–ฝํ˜€์žˆ์–ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š์Œ
     ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€
     ๊ฐ์ฒด์ง€ํ–ฅ์ด ๋‚˜์˜ค๊ฒŒ๋จ

 ๊ฐ์ฒด์ง€ํ–ฅ์€ ํ˜„์‹ค์„ธ๊ณ„์— ์กด์žฌํ•˜๋Š” ์‹ค์ฒด ๋ฐ ๊ฐœ๋…๋“ค์„ ๊ฐ์ฒด๋ผ๋Š” ๋…๋ฆฝ๋œ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ & ๋ฉ”์„ธ์ง€๋กœ ์ƒํ˜ธ์ž‘์šฉ & ๊ฐ์ฒด์ง€ํ–ฅ ์‹œ์Šคํ…œ์„ ๊ฐ€์‹œํ™”ํ•˜๊ณ  ๋ช…์„ธํ™”ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•œ๊ฒƒ์ด UML

 

๊ฐ์ฒด์ง€ํ–ฅ ์š”์†Œ

• ๊ฐ์ฒด(Object) : ์†์„ฑ๊ณผ ํ–‰๋™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒƒ
     (์ž๋ฃŒ(=์†์„ฑ(๋ณ€์ˆ˜) + ๊ฐ’(๋ณ€์ˆ˜๊ฐ’)=ํด๋ž˜์Šค์—์„œ ์ •์˜) ๋ฐ ์˜คํผ๋ ˆ์ด์…˜(=ํด๋ž˜์Šค์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋ฉ”์†Œ๋“œ))

 ํด๋ž˜์Šค(Class) : ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ‹€ 

 ๋ฉ”์„ธ์ง€(Message) : ์–ด๋–ค ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ํŠน์ • ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ์‹ ํ˜ธ
     ์ˆ˜์‹ ๊ฐ์ฒด ์ด๋ฆ„ + ์ˆ˜ํ–‰ํ•  ์˜คํผ๋ ˆ์ด์…˜ ์ด๋ฆ„ + ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ 

 

๊ฐ์ฒด์ง€ํ–ฅ ํŠน์„ฑ

 ์บก์Šํ™”(Encapsulation) : ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ๋™์ž‘์— ๋Œ€ํ•œ ํ๋ฆ„์„ ์ž์„ธํ•˜๊ฒŒ ์•Œํ•„์š” ์—†์ด, ์™ธ๋ถ€์—์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š”๊ฒƒ. 
     ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด ๋‚ด ์ง์ ‘ ์ ‘๊ทผ X
     ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๊ด€๋ จ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ (์ด๋กœ์จ ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๊ฐ€๋Šฅ)
     ์ •๋ณด์€๋‹‰์ด ๊ฐ€๋Šฅ 

 ์ƒ์†(Inheritance) : ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์ˆ˜๋‹จ
     ์žฌ์‚ฌ์šฉ ๋ฐ ํ™•์žฅ์„ฑ 
     ์ผ๋ฐ˜ํ™”(Generalization) : ํ•˜์œ„ํด๋ž˜์Šค์˜ ๊ณตํ†ต์  ํŠน์„ฑ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๋Š”๊ฒƒ (ํ•˜์œ„ -> ์ƒ์œ„)
     ํŠน์ˆ˜ํ™”(Specialization) : ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์†์„ฑ์„ ์ƒ์†๋ฐ›์•„ ํ•˜์œ„ ํด๋ž˜์Šค์— ์‹ค์ฒดํ™” (์ƒ์œ„ -> ํ•˜์œ„)

 ์ถ”์ƒํ™”(Abstraction) : ํŠน์ •์ธก๋ฉด์„ ๊ฐ•์กฐํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ๊ฒƒ. ์‹ค์„ธ๊ณ„์ƒํ™ฉ์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜์—ฌ ์ด๊ฒƒ์„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ตฌํ˜„(=์‹ค์ฒดํ™”)

 ๋‹คํ˜•์„ฑ(Polymorphism) : ์—ฌ๋Ÿฌํด๋ž˜์Šค์— ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ช…์„ ์‚ฌ์šฉํ•˜๋‚˜, ๋™์ž‘์ด ๋‹ค๋ฅธ ์ผ€์ด์Šค (์˜ค๋ฒ„๋ผ์ด๋”ฉ)

 

>>> ์บก์Šํ™”์™€ ์ถ”์ƒํ™”๋ฅผ ํ—ค๊น”๋ฆฌ๋ฉด ์•ˆ๋ ๋“ฏ!
์บก์Šํ™”๋Š” ๊ฒฐ๊ณผ์˜ ํ–‰๋™๋งŒ ๋ฐ”๋ผ๋ณด๋Š”๊ฒƒ์ด๋ฉด(ํ˜ธ์ถœํ•˜๋Š”์ž์˜ ์ž…์žฅ์—์„  ๋‚ด๋ถ€์‚ฌ์ •์€ ์•Œํ•„์š” ์—†๋‹ค!), ์ถ”์ƒํ™”๋Š” ๊ตฌ์ฒดํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์˜ ์‹œ์ž‘์œผ๋กœ ๋ด์•ผํ• ๋“ฏ

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์Šคํ”„๋ง๋ถ€ํŠธ?

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ž๋ฐ” ์›น๊ฐœ๋ฐœ์„ ๋นจ๋ฆฌ ํ•˜๊ธฐ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ ์ž…๋‹ˆ๋‹ค. (ํ”„๋ ˆ์ž„์›Œํฌ)

 

์Šคํ”„๋ง๊ณผ ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ฐจ์ด

1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ค์ • ๊ฐ„์†Œํ™” 
    โ€ฃ ์Šคํ”„๋ง์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง์ ‘ ์—ฐ๋™ํ•ด์•ผํ•˜๋‚˜, ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ๋ฏธ๋ฆฌ ์„ค์ •๋œ ์Šคํƒ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ตœ์ ํ™”ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์—ฐ๋™ X

2. ์›น์„œ๋ฒ„ ๋‚ด์žฅ
    โ€ฃ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ํ†ฐ์บฃ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Œ, ์Šคํ”„๋ง์€ ํ†ฐ์บฃ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Œ

 

์›น ์„œ๋น„์Šค ๋™์ž‘ ์›๋ฆฌ

1. ํด๋ผ์ด์–ธํŠธ
    โ€ฃ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ or ์ปดํ“จํ„ฐ

2. ์„œ๋ฒ„
    โ€ฃ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ or ์ปดํ“จํ„ฐ

โœ“ ํด๋ผ์ด์–ธํŠธ ←→ ์„œ๋ฒ„ ์‚ฌ์ด์—๋Š” ์š”์ฒญ(request) ์™€ ์‘๋‹ต(response) ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
    โ€ฃ ์ „์ œ์กฐ๊ฑด์€ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰์ค‘! ์ด์—ฌ์•ผ ํ•จ 

 

localhost ์™€ ์Šคํ”„๋ง์—์„œ์˜ ํ˜ธ์ถœ!

    โ€ฃ 127.0.0.1 ์„ ๊ณ ์œ  ์ง€์นญํ•œ๊ฒƒ (๋‚ด ์ปดํ“จํ„ฐ์˜ ์ฃผ์†Œ)
    โ€ฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ localhost:8080/hello.html ์„ ํ˜ธ์ถœ ํ•œ๋‹ค๋ฉด ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์‘๋‹ต์œผ๋กœ hello.html  ์„ ๋ณด์—ฌ์คŒ
    โ€ฃ hello.html์€ ์„œ๋ฒ„์—์„œ ์š”์ฒญํ•œ ํŒŒ์ผ! (src > main > resources > static ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐพ์Œ)

 

์‹ค์Šต๊ด€๋ จ

1. JVM ์„ค์น˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™

cd Library/Java/JavaVirtualMachines


2. JDK ์‚ญ์ œ ๋ช…๋ น

sudo rm -rf ์„ค์น˜๋œ JDK ๋ฒ„์ „

 

3. ์ธํ…”๋ฆฌ์ œ์ด ์˜์–ด ๋ฉ”๋‰ด ๊ถŒ์žฅ
    โ€ฃ ์ธํ…”๋ฆฌ์ œ์ด ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฐ”์—์„œ Intellij IDEA > ์„ค์ • > ํ”Œ๋Ÿฌ๊ทธ์ธ > ์„ค์น˜ํƒญ > Korean Language Pack ์ฒดํฌ ํ•ด์ œ 

 

4. ์ž๋ฐ” ๋ฒ„์ „ ์˜ค๋ฅ˜
    โ€ฃ springboot3.x ๋ถ€ํ„ฐ๋Š” JDK17 ์ด์ƒ๋งŒ ์ง€์›ํ•จ! ๋งŒ์•ฝ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ build.gradle ์„ค์ • ํ™•์ธ! (sourceCompatibility = '17') 
    โ€ฃ ๊ทธ๋ž˜๋„ ์•ˆ๋˜๋ฉด ์ธํ…”๋ฆฌ์ œ์ด java ์„ค์ • ํ™•์ธ! (File → Settings ๋ฉ”๋‰ด)

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

AOP ๊ฐ€ ์ ์šฉ๋œ ํด๋ž˜์Šค์—์„œ(=ํฌ์ธํŠธ์ปท์˜ ์˜ํ–ฅ์„ ๋ฐ›์€ ํด๋ž˜์Šค) ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ์•ˆ๋˜๋Š” ์ƒํ™ฉ์ด ์žˆ์—ˆ์Œ!

SampleService ํด๋ž˜์Šค์˜ sample() ๋ฉ”์†Œ๋“œ ๋‚ด์— sampleRecall1(), sampleRecall2() ๋Š” ๋ชจ๋‘ AOP ์˜ ์˜ํ–ฅ์„ ๋ฐ›์„๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ทธ๋ ‡์ง€๊ฐ€ ์•Š์•˜์Œ!
์ด์œ ๋Š”, AOP๊ฐ€ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์ด์˜€๊ธฐ ๋•Œ๋ฌธ์ด์˜€์Œ!

ํ”„๋ก์‹œ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋ก์‹œ ํด๋ž˜์Šค(SampleServiceV2ProcxyImpl)๊ฐ€ ํ•ต์‹ฌ๊ธฐ๋Šฅ ํด๋ž˜์Šค(SampleServiceV2)๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ํ”„๋ก์‹œ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ(SampleServiceV2ProcxyImpl ์˜ sample())๋ฅผ ํ˜ธ์ถœํ•œ ํ›„, ํ•ต์‹ฌ๊ธฐ๋Šฅ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ(SampleServiceV2 ์˜ sample())๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ  
= ํ•ต์‹ฌ๊ธฐ๋Šฅ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ(SampleServiceV2 ์˜ sample()) ์‹คํ–‰์‹œ์  ๊ธฐ์ค€์œผ๋กœ ํ”„๋ก์‹œ(SampleServiceV2ProcxyImpl ์˜ sample())๋ฅผ ์ ์šฉํ• ์ˆ˜์žˆ๋‹ค๋Š”๊ฑธ ์•Œ์ˆ˜์žˆ์Œ

๋”ฐ๋ผ์„œ ํ•ต์‹ฌ๊ธฐ๋Šฅ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ(SampleServiceV2 sample()) ๋‚ด์˜ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋“ค(SampleServiceV2 ์˜ sampleRecall1(), sampleRecall2())์€ ํ”„๋ก์‹œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋จ!

๋ฐ˜์‘ํ˜•

'๊ฐœ๋ฐœ > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WebSocket] ์›น์†Œ์ผ“  (0) 2022.03.29
ํŠธ๋žœ์žญ์…˜  (0) 2021.11.25
Spring - ์Šคํ”„๋ง MVC ๊ฐ„๋‹จ ์ •๋ฆฌ  (0) 2021.06.05
Spring - DI (Dependency Injection)  (0) 2021.06.01
Spring - AOP(Aspect-Oriented Programming)  (0) 2021.05.25
๋ฐ˜์‘ํ˜•
์„ค๋ช…

์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ )
WebSocket ์˜ ๊ฒฝ์šฐ, ์„œ๋ฒ„ <-> ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ํ•˜์ง€๋งŒ, SSE ์˜ ๊ฒฝ์šฐ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์„ ํ•จ!
๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•œ ์•Œ๋ฆผ ์ „์†ก ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋“ฑ์— ์ ํ•ฉํ•œ ๊ธฐ์ˆ 

 

๊ตฌํ˜„ ์˜ˆ์ œ 
// server-side

// case1) SseEmitter ์ด์šฉ
// https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/ ์ฐธ๊ณ  


// case2) WebFlux ์ด์šฉ 
// ...
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> sse() {
    return Flux.just("Server time: " + LocalDateTime.now())
            .doFinally(signalType -> {
                if (signalType == SignalType.CANCEL || signalType == SignalType.ON_COMPLETE) {
                    log.info("Closing SSE connection");
                }
            });

    ..
}
<!-- client-side --> 
<!-- server-side ์˜ case2) ๋ฐฉ์‹ ๋Œ€์‘ --> 

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>SSE TEST</title>
</head>
<body>
<h1>SSE TEST</h1>
<div id="sse-data"></div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>

  const eventSource = new EventSource("{server-side์ฃผ์†Œ}/sse");
  eventSource.onmessage = event => {
     $("#sse-data").append(event.data); // ์ด๋ถ€๋ถ„์„ ํ† ์ŠคํŠธ ํŒ์—… ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋จ!
  };

  eventSource.onerror = error => {
    console.error("SSE error:", error);
    eventSource.close();
  };
</script>
</body>
</html>
๋ฐ˜์‘ํ˜•

'๊ฐœ๋ฐœ > etc' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vault  (1) 2023.02.07
ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ (Hexagonal Architecture)  (2) 2022.09.25
JWT (JSON WEB TOKEN)  (0) 2021.12.22
Rest API  (0) 2021.06.02
HTTP๊ด€๋ จ (https, spdy, ajax, websocket)  (0) 2018.12.09

+ Recent posts