02I. ์๋น์ค
02I. ์๋น์ค ๊ด๋ จ
์ด์ ์ฅ์์ ์ง๋ฌธ ๋ชฉ๋ก์ ๋ง๋ค์๋ค. ์ด์ ์ง๋ฌธ ๋ชฉ๋ก์ ์ ๋ชฉ ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ์ง๋ฌธ ์์ธ ํ๋ฉด์ด ๋ณด์ด๊ฒ ํ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ ์ ์ ์ ์๊ฐํ ๊ฒ์ด ์๋ค. ์ฐ๋ฆฌ๋ QuestionController
์์ QuestionRepository
๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ์ง๋ฌธ ๋ชฉ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ๊ท๋ชจ์๋ ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ ์ค๊ฐ์ ์๋น์ค(Service)๋ฅผ ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์๋น์ค๋ ์คํ๋ง์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ฑํ๋ ํด๋์ค์ด๋ค.
์๋น์ค๊ฐ ํ์ํ ์ด์
์๋น์ค๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ผ๊น?
๋ชจ๋ํ
์๋ฅผ๋ค์ด ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ์ฌ๋ฌ๊ฐ์ ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํํ ๊ฐ๊ณตํ์ฌ ๋ฆฌํดํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋น์ค๋ก ๋ง๋ค์ด ๋๋ฉด ์ปจํธ๋กค๋ฌ์์๋ ํด๋น ์๋น์ค๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค. ํ์ง๋ง ์๋น์ค๋ก ๋ง๋ค์ง ์๊ณ ์ปจํธ๋กค๋ฌ์์ ๊ตฌํํ๋ ค ํ๋ค๋ฉด ํด๋น ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋์ผํ ๊ธฐ๋ฅ์ ์ค๋ณต์ผ๋ก ๊ตฌํํด์ผ ํ๋ค. ์ด๋ฌํ ์ด์ ๋ก ์๋น์ค๋ ๋ชจ๋ํ๋ฅผ ์ํด์ ํ์ํ๋ค.
๋ณด์
์ปจํธ๋กค๋ฌ๋ ๋ฆฌํฌ์งํฐ๋ฆฌ ์์ด ์๋น์ค๋ฅผ ํตํด์๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ณด์์ ์์ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ํด์ปค๊ฐ ํดํน์ ํตํด ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋๋๋ผ๋ ๋ฆฌํฌ์งํฐ๋ฆฌ์ ์ง์ ์ ๊ทผํ ์๋ ์๊ฒ ๋๋ค.
์ํฐํฐ ๊ฐ์ฒด์ DTO ๊ฐ์ฒด์ ๋ณํ
์ฐ๋ฆฌ๊ฐ ์์ฑํ Question
, Answer
ํด๋์ค๋ ์ํฐํฐ(Entity) ํด๋์ค์ด๋ค. ์ํฐํฐ ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ๋ง๋ฟ์ ์๋ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ๋ ํ์๋ฆฌํ ๊ฐ์ ํ
ํ๋ฆฟ ์์ง์ ์ ๋ฌํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์๋ค. ์ปจํธ๋กค๋ฌ๋ ํ์๋ฆฌํ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ ์์ฑ์ ๋ณ๊ฒฝํ์ฌ ๋น์ฆ๋์ค์ ์ธ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ์ํฐํฐ๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ์์ฑ์ ๋ณ๊ฒฝํ๋ค๋ฉด ํ
์ด๋ธ ์ปฌ๋ผ์ด ๋ณ๊ฒฝ๋์ด ์๋ง์ด ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ์ด์ ๋ก Question
, Answer
๊ฐ์ ์ํฐํฐ ํด๋์ค๋ ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ๋ ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ Question
, Answer
๋์ ์ฌ์ฉํ DTO(Data Transfer Object) ํด๋์ค๊ฐ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ Question
, Answer
๋ฑ์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ DTO ๊ฐ์ฒด๋ก ๋ณํํ๋ ์์
๋ ํ์ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ํฐํฐ ๊ฐ์ฒด๋ฅผ DTO ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ผ์ ์ด๋์ ์ฒ๋ฆฌํด์ผ ํ ๊น? ๊ทธ๋ ๋ค. ๋ฐ๋ก ์๋น์ค์ด๋ค. ์๋น์ค๋ ์ปจํธ๋กค๋ฌ์ ๋ฆฌํฌ์งํฐ๋ฆฌ์ ์ค๊ฐ์์ ์ธ ์
์ฅ์์ ์ํฐํฐ ๊ฐ์ฒด์ DTO ๊ฐ์ฒด๋ฅผ ์๋ก ๋ณํํ์ฌ ์๋ฐฉํฅ์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
QuestionService
๋ค์๊ณผ ๊ฐ์ด QuestionService
๋ฅผ ์์ฑํ์.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionService.java
package com.mysite.sbb.question;
import java.util.List;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class QuestionService {
private final QuestionRepository questionRepository;
public List<Question> getList() {
return this.questionRepository.findAll();
}
}
์คํ๋ง์ ์๋น์ค๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ์์ ๊ฐ์ด ํด๋์ค๋ช
์์ @Service
์ ๋ํ
์ด์
์ ๋ถ์ด๋ฉด ๋๋ค. @Controller
, @Entity
๋ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋ง๋ถํธ๋ @Service
์ ๋ํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ ์๋น์ค๋ก ์ธ์ํ๋ค.
questionRepository
๊ฐ์ฒด๋ ์์ฑ์ ๋ฐฉ์์ผ๋ก DI ๊ท์น์ ์ํด ์ฃผ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๋ฌธ ๋ชฉ๋ก์ ์กฐํํ์ฌ ๋ฆฌํดํ๋ getList ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค. ์ด์ ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ๊ทธ๋๋ก ์ฎ๊ธด ๊ฒ์ด๋ค.
QuestionController
๊ทธ๋ฆฌ๊ณ QuestionController
๋ ๋ฆฌํฌ์งํฐ๋ฆฌ ๋์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๋ค์์ฒ๋ผ ์์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionController.java
// (... ์๋ต ...)
public class QuestionController {
private final QuestionService questionService;
@GetMapping("/question/list")
public String list(Model model) {
List<Question> questionList = this.questionService.getList();
model.addAttribute("questionList", questionList);
return "question_list";
}
}
questionService
๊ฐ์ฒด๋ ์์ฑ์ ๋ฐฉ์์ผ๋ก DI ๊ท์น์ ์ํด ์ฃผ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ก http://localhost:8080/question/list
ํ์ด์ง์ ์ ์ํ๋ฉด ์ด์ ๊ณผ ๋์ผํ ํ๋ฉด์ ๋ณผ์ ์๋ค. ์์ผ๋ก ์์ฑํ ์ปจํธ๋กค๋ฌ๋ค๋ ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ Controller -> Service -> Repository
๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค.