[SPRING] 3Layer Architecture

라미·2024년 2월 25일

spring

목록 보기
5/17
post-thumbnail

3Layer Architecture

Controller

클라이언트의 요청을 받고, 요청에 대한 로직 처리를 Service에게 전담한다.
Service에서 처리 완료된 결과를 클라이언트에게 응답한다.

Service

사용자의 요구사항을 처리하는 실세이다.
DB저장 및 조회가 필요할 때는 Repository에 요청한다.

Repository :

DB 관리, DB 작업(CRUD) 처리

에 따라서 분리하는 작업을 진행하였다.


📝 Controller

//기존 코드
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
    // RequestDto -> Entity
    Memo memo = new Memo(requestDto);

    // DB 저장
    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);

    // DB Insert 후 받아온 기본키 확인
    Long id = keyHolder.getKey().longValue();
    memo.setId(id);

    // Entity -> ResponseDto
    MemoResponseDto memoResponseDto = new MemoResponseDto(memo);

    return memoResponseDto;
}

// service 와 repository 분리
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {

    // service 요청하기, 로직처리를 서비스단으로 변경
    MemoService memoService = new MemoService(jdbcTemplate); // 서비스 객체 생성 
    return memoService.createMemo(requestDto); // 클라이언트에서 전달받은 데이터도 사용 받게 함께 전달
}

📝 Service

// controller 에서 요청받은 비즈니스 로직 수행
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
    // RequestDto -> Entity
    Memo memo = new Memo(requestDto);

    // DB 저장 필요하기 때문에 repository에 요청
    MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
    Memo saveMemo = memoRepository.save(memo); // db에 저장

    // Entity -> ResponseDto
    MemoResponseDto memoResponseDto = new MemoResponseDto(memo);

    return memoResponseDto;
}

📝 Repository

// 서비스에서 요청한 db 관련 crud 작업 진행
public Memo save(Memo memo) {
    // db 저장
    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);

    // DB Insert 후 받아온 기본키 확인
    Long id = keyHolder.getKey().longValue();
    memo.setId(id);

    return memo;
}

0개의 댓글