25일차 - Spring강의(3 Layer Architecture)

2024. 8. 19. 20:03·Java & Spring/Spring

□ 3 Layer Architecture

  1. Controller
    • 클라이언트의 요청을 받음
    • 요청에 대한 로직 처리는 Service에게 전담
    • Service에서 처리 완료된 결과를 클라이언트에게 응답
  2. Service
    • 사용자의 요구사항을 처리(비즈니스 로직)하는 실세
    • DB저장 및 조회가 필요할 때는 Repository에게 요청
  3. Repository
    • DB관리(연결, 해제, 자원관리)
    • DB CRUD작업을 처리

□ Controller에서 Service분리해보기

- 분리 전(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;
}

 

- 분리 후(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) {
        // 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;
    }
}
  1. service패키지에 Service클래스를 생성
  2. Service클래스에 비즈니스로직 구현(Controller의 비즈니스로직 분리)
  3. Controller에서 Service객체를 생성하고 메서드 호출
  4. 해당 메서드는 Controller에서 받는 입력값을 매개변수로 받는다.

□ Service에서 Repository분리해보기

- 분리 전(Service)

 public MemoResponseDto createMemo(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);

        return memo;
    }

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

        return memoResponseDto;
    }

 

- 분리 후(Service, Repository)

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

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

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

        return memoResponseDto;
    }
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;
    }
  1. Service클래스의 비즈니스 로직 중 데이터베이스와 연동하는 부분을 Repository클래스로 옮긴다.
  2. entity, dto변환부분은 Repository영역이아니므로 남겨둔다.

'Java & Spring > Spring' 카테고리의 다른 글

28일차 - Spring강의(Bean 수동 등록, Type중복 시 Bean 주입)  (0) 2024.08.22
26일차 - Spring강의(Entity, 영속성 컨텍스트)  (0) 2024.08.20
25일차 - Spring강의(IoC와 DI)  (0) 2024.08.19
21일차 - Spring강의(Spring MVC)  (0) 2024.08.12
21일차 - Spring강의(테스트 코드, lombok)  (0) 2024.08.12
'Java & Spring/Spring' 카테고리의 다른 글
  • 26일차 - Spring강의(Entity, 영속성 컨텍스트)
  • 25일차 - Spring강의(IoC와 DI)
  • 21일차 - Spring강의(Spring MVC)
  • 21일차 - Spring강의(테스트 코드, lombok)
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
        • 개념
        • 정보처리기사 필기
        • 정보처리기사 실기 기출
        • 네트워크관리사 2급
        • SQLD
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • 웹
      • git & github
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스 java 기초트레이닝
    java 에라토스테네스의 체
    java 멤버
    java two-pointer
    java 제어자
    java 메서드
    java enhance switch
    java 세수의합
    개발로드맵
    데이터 크기
    java
    Java this
    java arrays.copyofrnage()
    Java 생성자
    프로그래머스 java 기초 트레이닝
    데이터 타입
    java super
    java 유클리드 호제법
    자료구조
    java기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
25일차 - Spring강의(3 Layer Architecture)
상단으로

티스토리툴바