- Controller
- 클라이언트의 요청을 받음
- 요청에 대한 로직 처리는 Service에게 전담
- Service에서 처리 완료된 결과를 클라이언트에게 응답
- Service
- 사용자의 요구사항을 처리(비즈니스 로직)하는 실세
- DB저장 및 조회가 필요할 때는 Repository에게 요청
- Repository
- DB관리(연결, 해제, 자원관리)
- DB CRUD작업을 처리
- 분리 전(Controller)
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(con -> {
PreparedStatement preparedStatement = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, memo.getUsername());
preparedStatement.setString(2, memo.getContents());
return preparedStatement;
},
keyHolder);
Long id = keyHolder.getKey().longValue();
memo.setId(id);
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
- 분리 후(Controller, Service)
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
MemoService memoService = new MemoService(jdbcTemplate);
return memoService.createMemo(requestDto);
}
public class MemoService {
private final JdbcTemplate jdbcTemplate;
public MemoService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update( con -> {
PreparedStatement preparedStatement = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, memo.getUsername());
preparedStatement.setString(2, memo.getContents());
return preparedStatement;
},
keyHolder);
Long id = keyHolder.getKey().longValue();
memo.setId(id);
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
}
- service패키지에 Service클래스를 생성
- Service클래스에 비즈니스로직 구현(Controller의 비즈니스로직 분리)
- Controller에서 Service객체를 생성하고 메서드 호출
- 해당 메서드는 Controller에서 받는 입력값을 매개변수로 받는다.
- 분리 전(Service)
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update( con -> {
PreparedStatement preparedStatement = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, memo.getUsername());
preparedStatement.setString(2, memo.getContents());
return preparedStatement;
},
keyHolder);
Long id = keyHolder.getKey().longValue();
memo.setId(id);
return memo;
}
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
- 분리 후(Service, Repository)
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
Memo saveMemo = memoRepository.save(memo);
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
public Memo save(Memo memo) {
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update( con -> {
PreparedStatement preparedStatement = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, memo.getUsername());
preparedStatement.setString(2, memo.getContents());
return preparedStatement;
},
keyHolder);
Long id = keyHolder.getKey().longValue();
memo.setId(id);
return memo;
}
- Service클래스의 비즈니스 로직 중 데이터베이스와 연동하는 부분을 Repository클래스로 옮긴다.
- entity, dto변환부분은 Repository영역이아니므로 남겨둔다.