[์น๊ฐ๋ฐ์ ๋ด, Spring] 2์ฃผ์ฐจ ๊ฐ๋ฐ์ผ์ง(3) - Lombok, DTO, Controller
[์น๊ฐ๋ฐ์ ๋ด, Spring] 2์ฃผ์ฐจ ๊ฐ๋ฐ์ผ์ง(1) - RDBMS, H2, SQL
[์น๊ฐ๋ฐ์ ๋ด, Spring] 2์ฃผ์ฐจ ๊ฐ๋ฐ์ผ์ง(2) - JPA์ CRUD์ Repository
์ด๋ฒ ํฌ์คํ ์์ ์ ๋ฆฌํ ๋ถ๋ถ์ Lombok, DTO, Controller์ ๊ดํ ๋ด์ฉ์ด๋ค.
Lombok
๐ก Lombok์ด๋?
Lombok(๋กฌ๋ณต)์ ์๋ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๋๋ฐ ๊ฑฐ์ ํ์์ ์ผ๋ก ํ์ํ ๋ฉ์๋/์์ฑ์ ๋ฑ์ ์๋ ์์ฑํด์ค์ผ๋ก์จ ์ฝ๋๋ฅผ ์ ์ฝํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. plugins์์ lombok์ ๊ฒ์ํด์ ์ค์นํ ํ ์ฌ์ฉํ ์ ์๋ค.
Getter, NoArgsConstructor, RequiredArgsConstructor ๋ฑ์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ดค๋ค.
DTO
๐ก DTO์ ํ์์ฑ
read, update๋ฅผ ํ ๋ Course ํด๋์ค๋ฅผ ๋ง ์จ๋ ๋ ๊น? ๋ด๊ฐ ์๋ ๋ค๋ฅธ ์ฌ๋์ด ๋ณ๊ฒฝํ๋ค๋ฉด?? ์ฆ, ํ ์ด๋ธ์ ๋ง ๊ฑด๋๋ ค๋ ๋๋ ๊ฑธ๊น??? ์ด๋ฐ ๊ฑฑ์ ์ด ๋ค ๋, ์์ถฉ์ฌ๋ก ํ์ฉํ๋ ๊ฒ์ด DTO(Data Transfer Object)์ด๋ค.
๐ก DTO ์ ์ฉํ๊ธฐ
DTO๋ฅผ 2์ฃผ์ฐจ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด์.
1. src > main > java > com.sparta.week02 > domain์ CourseRequestDto ํด๋์ค๋ฅผ ์์ฑํ๋ค.
@NoArgsConstructor
@Getter
public class CourseRequestDto {
private String title;
private String tutor;
public CourseRequestDto(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
2. CourseService, Course, Week02Application ํด๋์ค์์ update ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ๋ CourseRequestDto๋ฅผ ์ด์ฉํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค.
- CourseSercvie.java ์์
@RequiredArgsConstructor
@Service
public class CourseService {
private final CourseRepository courseRepository;
@Transactional
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("ํด๋น ์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
);
course1.update(requestDto);
return course1.getId();
}
}
Controller
๐ก API
API๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ์ฝ์์ด๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ํ๋๋ก ์๋ฒ์๊ฒ ์์ฒญ(Request)์ ๋ณด๋ด๋ฉด, ์๋ฒ๊ฐ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ์ฌ ์๋ต(Response)์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
REST๋ ์ฃผ์์ ๋ช ์ฌ, ์์ฒญ ๋ฐฉ์์ ๋์ฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋์ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์ ๋์ฌ๋ ์ ์ ๋งํ๋ CRUD๋ฅผ ์ง์นญํ๋ค. ์๋ฅผ ๋ค์๋ฉด courses์ ๋ํด ์์ฑ(POST)/์กฐํ(GET)/์์ (PUT)/์ญ์ (DELETE) ์์ฒญํ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก, ์ฃผ์์ ๋ค์ด๊ฐ๋ ๋ช ์ฌ๋ค์ ๋ณต์ํ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฃผ์์ ๋์ฌ๋ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋ค.
๐ก Controller์ API ์์ฑํ๊ธฐ
controller ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ CourseController ํด๋์ค๋ฅผ ์์ฑํ๋ค.
@RequiredArgsConstructor
@RestController
public class CourseController {
private final CourseRepository courseRepository;
// ์ฌ๊ธฐ์ API ์์ฑํ ์์
}
- GET
@GetMapping("/api/courses")
public List<Course> getCourses() {
return courseRepository.findAll();
}
- POST
@PostMapping("/api/courses")
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
Course course = new Course(requestDto);
return courseRepository.save(course);
}
- PUT
@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
return courseService.update(id, requestDto);
}
- DELETE
@DeleteMapping("/api/courses/{id}")
public Long deleteCourse(@PathVariable Long id) {
courseRepository.deleteById(id);
return id;
}
์ฐธ๊ณ ) ๊ฐ์์์ ARC(Advanced REST Client)๋ฅผ ์ด์ฉํด์ API ๊ธฐ๋ฅ ํ์ธ์ ํ๋ค. ์ฃผ์ํ ์ ์ POST, PUT ์์ฒญ์ ๋ํด์๋ header์ Content-Type์ application/json์ผ๋ก ์ถ๊ฐํ ๋ค, body์ json ํ์์ผ๋ก course ์ ๋ณด๋ฅผ ๋๊ฒจ์ค์ผ ํ๋ค.
์ฐธ๊ณ ์๋ฃ: ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ์ ๋ด, Spring 2์ฃผ์ฐจ ๊ฐ์์๋ฃ