Day 4

Day4

๋“ฑ๋ก/์ˆ˜์ •/์กฐํšŒ API ๋งŒ๋“ค๊ธฐ

๐Ÿ‘‰API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด 3๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

  • Request ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ DTO

  • API ์š”์ฒญ์„ ๋ฐ›์„ Controller

  • ํŠธ๋žœ์žญ์…˜, ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” Service

โœ…service๋Š” ํŠธ๋žœ์žญ์…˜, ๋„๋ฉ”์ธ ๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ

Web Layer, Service Layer, Repository Layer, Dtos, Domain Model

  • Web Layer

    • ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ JSP/Freemarker ๋“ฑ์˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์˜์—ญ

    • ์ด์™ธ์—๋„ @Filter, ์ธํ„ฐ์…‰ํ„ฐ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋“œ๋ฐ”์ด์Šค(@ControllerAdvice)๋“ฑ ์™ธ๋ถ€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์˜์—ญ์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค

  • Service Layer

    • @Service์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ์˜์—ญ

    • ์ผ๋ฐ˜์ ์œผ๋กœ Controller์™€ Dao์˜ ์ค‘๊ฐ„ ์˜์—ญ์—์„œ ์‚ฌ์šฉ

    • @Transactional์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ

  • Repository Layer

    • db์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์˜์—ญ

    • ๊ธฐ์กด์˜ DAO๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ

  • Dtos

    • Dto(Data Transfer Object)๋Š” ๊ณ„์ธต ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ด์•ผ๊ธฐํ•˜๋ฉฐ

  • Domain Model

    • ๋„๋ฉ”์ธ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐœ๋ฐœ ๋Œ€์ƒ์„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™” ์‹œํ‚จ ๊ฒƒ

    • @Entity๊ฐ€ ์‚ฌ์šฉ๋œ ์˜์—ญ์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ

    • ๋ฌด์กฐ๊ฑด db์˜ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

โœ…web, service, repository, dto, domain์ด 5๊ฐ€์ง€์˜ ๋ ˆ์ด์–ด์—์„œ ๋น„์ง€๋‹ˆ์Šค๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์€ Domain

โœ…์„œ๋น„์Šค๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ๋„๋ฉ”์ธ ๊ฐ„์˜ ์ˆœ์„œ๋งŒ ๋ณด์žฅ

๐Ÿ‘‰์ฝ”๋“œ ์ž‘์„ฑ

/src/main/java/com/kyu/book/springboot/service/posts/PostsService.class

์Šคํ”„๋ง์—์„œ Bean์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹

  • @Autowired

  • setter

  • ์ƒ์„ฑ์ž

โœ… ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹ : ์ƒ์„ฑ์ž โ‡’ @RequiredArgsConstructor๋กœ ํ•ด๊ฒฐ

@RequiredArgsConstructor๋Š” final์ด ์„ ์–ธ๋œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž

Controller์™€ Service์—์„œ ์‚ฌ์šฉํ•  Dtoํด๋ž˜์Šค

src/main/java/com/kyu/book/springboot/web/dto/PostsSaveRequestDto.java

Entityํด๋ž˜์Šค๋Š” db์™€ ๋งž๋‹ฟ์€ ํ•ต์‹ฌ ํด๋ž˜์Šค, Entityํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๊ณ , ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋จ

โœ… View Layer์™€ DB Layer์˜ ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ : Controller์—์„œ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ์ค˜์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ธฐ ๋–„๋ฌธ์—

โ‡’Entity ํด๋ž˜์Šค์™€ Controller์—์„œ ์“ธ Dto๋Š” ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋ผ

Entityํด๋ž˜์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

src/test/java/com/kyu/book/springboot/web/PostsApiControllerTest.java

์—ฌ๊ธฐ์„œ๋Š” @WebMvcTest๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ  : ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด JPA๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

JPA๊ธฐ๋Šฅ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” @SpringBootTest์™€ @TestRestTemplate์„ ์‚ฌ์šฉํ•˜๋ผ

์ˆ˜์ • / ์กฐํšŒ๊ธฐ๋Šฅ

src/main/java/com/kyu/book/springboot/web/PostsApiController.java

src/main/java/com/kyu/book/springboot/web/dto/PostsResponseDto.class

src/main/java/com/kyu/book/springboot/web/PostsUpdateRequestDto.class

src/main/java/com/kyu/book/springboot/domain/posts/Posts ์— ์ด๊ฑฐ ์ถ”๊ฐ€

src/main/java/com/kyu/book/springboot/service/posts/PostsService ์— ์ด๊ฑฐ ์ถ”๊ฐ€

update ๊ธฐ๋Šฅ์—์„œ db์— ์ฟผ๋ฆฌ๋ฌธ์„ ์•ˆ๋‚ ๋ฆผ โ‡’ JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋•Œ๋ฌธ์— ํ•„์š” ์—†์Œ

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ : ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ

ใ„ดJPA์˜ ํ•ต์‹ฌ ๋‚ด์šฉ์€ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ๋ƒ ์•„๋‹ˆ๋ƒ๋กœ ๊ฐˆ๋ฆผ

JPA์˜ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ(JPA์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ ์˜ต์…˜) ์‹œ, ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ด ๋ฐ์ดํ„ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์œ ์ง€๋œ ์ƒํƒœ์ด๋‹ค

์ด ์ƒํƒœ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ๋๋‚ ๋•Œ ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ๋ฌธ์„ ๋ฐ˜์˜

์ฆ‰, Entity ๊ฐ์ฒด์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ„๋„๋กœ Update์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค = ๋”ํ‹ฐ ์ฒดํ‚น

update๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋‹ˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

src/test/java/com/kyu/book/springboot/web/PostsApiControllerTest ์— ์ถ”๊ฐ€

local์—์„œ๋Š” db๋ฅผ h2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ ค๋ฉด ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•ด์•ผํ•จ

  1. application-properties์— ๋‹ค์Œ์„ ์ถ”๊ฐ€

  2. main์„ ์‹คํ–‰ํ•œ ํ›„, http://localhost:8080/h2-console ๋กœ ์ ‘์†

  3. JDBC URL ๋ถ€๋ถ„์„ jdbc:h2:mem:testdb ๋กœ ๋ณ€๊ฒฝํ›„, connect๋ฒ„ํŠผ ํด๋ฆญ

  4. insert into posts(author, content, title) values ('author', 'content', 'title'); ์„ ์ง‘์–ด ๋„ฃ๊ณ  run

  5. ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ http://localhost:8080/api/v1/posts/1 ๋กœ ๋“ค์–ด๊ฐ€๋ฉด insertํ•ด๋‘” posts๋“ค์ด ๋‚˜์˜ค๊ฒŒ ๋จ

Last updated

Was this helpful?