[SPRING] 3 Layer Architecture

야부엉·2023년 11월 3일
0

SPRING

목록 보기
7/45

1. 3 Layer Architecture

1. 탄생 배경

  • Controller 클래스 하나로 모든 API를 처리할 시에, 코드의 추가 혹은 변경 요청이 복잡 할 수도 있다. 이러한 문제점을 극복하기 위해 3 Layer Architecture 생겨났다.

2. 구조

  • Controller
    - 클라이언트의 요청과 응답을 담당한다.(수문장)
    - 요청과 함께온 데이터를 service에게 같이 전달 한다.
  • Service
    - 사용자의 요구사항을 실질적으로 처리한다.(실세)
    - DB 저장 및 조회는 Repository에게 요청
  • Repository
    - DB 관리, CRUD 작업을 담당한다

3. 예시

  • Controller
    - 요청에 들어온 데이터와 함께 service 클래스를 사용한다.
public class MemoController {
    // MemoController -> MemoService -> MemoRepository
    private final MemoService memoService;

    public MemoController(MemoService memoService) {
        this.memoService = memoService;
    }

    @PostMapping("/memos")
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
        return memoService.createMemo(requestDto);
    }
  • Service
    - 매개변수로 받은 데이터 처리를 한 후 , 저장을 위해 repository를 사용한다.
    public MemoResponseDto createMemo(MemoRequestDto requestDto) {
        // RequestDto -> Entity
        Memo memo = new Memo(requestDto);

        // DB 저장
        Memo saveMemo = memoRepository.save(memo);
        // Entity -> ResponseDto
        MemoResponseDto memoResponseDto = new MemoResponseDto(saveMemo);
        return memoResponseDto;
    }
  • Repository
    - DB와 관련된 작업을 한다.
 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;
    }

출처

내일배움캠프 Spring Master

profile
밤낮없는개발자

0개의 댓글