[Spring] 3 Layer Architecture

thingzoo·2023년 6월 25일
0

Spring

목록 보기
19/54
post-thumbnail
post-custom-banner

필요성

  • Controller 클래스 하나로 모든 API를 처리하면
    • 한 개의 클래스에 너무 많은 양의 코드가 존재하기 때문에 코드를 이해하기 어려움
  • 현업에서는 코드의 추가 혹은 변경 요청이 계속 생길 수 있음
  • 문제가 발생했는데 해당 Controller 클래스를 구현한 개발자가 퇴사한다면.. 😅

3 Layer Architecture


이러한 문제점들을 해결하기 위해 서버 개발자들은 서버에서의 처리과정이 대부분 비슷하다는 걸 깨닫고, 처리 과정을 크게 Controller, Service, Repository 3개로 분리

Controller

  • 클라이언트의 요청을 받음
  • 요청에 대한 로직 처리는 Service에게 전담
    • Request 데이터가 있다면 Service에 같이 전달
  • Service에서 처리 완료된 결과를 클라이언트에게 응답

Service

  • 사용자의 요구사항을 처리(비즈니스 로직)
    • 따라서 현업에서는 서비스 코드가 계속 비대해지고 있음
  • DB 저장 및 조회가 필요할 때는 Repository에게 요청

Repository

  • DB 관리 (연결, 해제, 자원 관리)
  • DB CRUD 작업을 처리

역할 분리하기

Controller

Controller는 API 요청을 받고 Service에 받아온 데이터와 함께 요청을 넘김

// Controller.java
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) { // 컨트롤러 메소드 이름과 
	MemoService memoService = new MemoService(jdbcTemplate);
    return memoService.createMemo(requestDto); // 서비스 메소드 이름을 일치 시키면 어떤 기능의 메소드인지 알기 쉽겠쥬?
}

Service

요청을 전달받은 Service는 해당 요청을 수행하고 필요시 DB 작업을 Repository에 요청

// Service.java
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
	// RequestDto -> Entity
    Memo memo = new Memo(requestDto);

    // DB 저장
    MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
    Memo savedMemo =  memoRepository.save(memo);

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

    return memoResponseDto;
}

Repository

Repository는 DB와 연결 및 CRUD 작업 진행

// Respoitory.java
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;
}
profile
공부한 내용은 바로바로 기록하자!
post-custom-banner

0개의 댓글