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๋ฅผ ์ฌ์ฉํ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ง์ ์ ๊ทผํ๋ ค๋ฉด ์น ์ฝ์์ ์ฌ์ฉํด์ผํจ
application-properties์ ๋ค์์ ์ถ๊ฐ
main์ ์คํํ ํ, http://localhost:8080/h2-console ๋ก ์ ์
JDBC URL ๋ถ๋ถ์ jdbc:h2:mem:testdb ๋ก ๋ณ๊ฒฝํ, connect๋ฒํผ ํด๋ฆญ
insert into posts(author, content, title) values ('author', 'content', 'title'); ์ ์ง์ด ๋ฃ๊ณ run
์ฐ๋ฆฌ๊ฐ ์์ฑํ http://localhost:8080/api/v1/posts/1 ๋ก ๋ค์ด๊ฐ๋ฉด insertํด๋ posts๋ค์ด ๋์ค๊ฒ ๋จ
Last updated
Was this helpful?