본문 바로가기
공부/자료조사

Controller, Service, Repository 가 무엇인가요?

by 고구밍 2022. 3. 24.

Controller, Service, Repository 가 무엇인가요? 

- 최봉진님 정리내용

 

Controller

컨트롤러란 클라이언트에 의해 서버로 요청이 전달 되었을 때 가장 먼저 진입하는 지점이다.

요청에 의해 어떤 처리를 할지 결정해 주며 Service에 해야할 일을 전달해 주는 역할을 한다.

그렇게 요청이 처리되었을 때 다시 클라이언트에게 View를 보내주는 역할을 한다.

MVC 모델에서 C의 역할이 Controller이다.

사용이유

우리가 컨트롤러를 사용하는 이유는 프로그램의 규모가 커짐에 따라 처리해야할 서비스들이 많아지는데 이를 하나의 클래스에 넣어 처리하면 가독성이 떨어질 뿐만 아니라 유지, 보수가 어렵다. 그렇기에 컨트롤러에서 중간 제어자 역할을 맡아 처리하게 만드는 것이다. 역할 분담은 유지, 보수 비용을 줄여주는데 효과적이다.

사용 예시

@PostMapping("/api/products")
    public Product createProduct(@RequestBody ProductRequestDto requestDto,
                                 @AuthenticationPrincipal UserDetailsImpl userDetails) {
// 로그인 되어 있는 회원 테이블의 ID
        Long userId = userDetails.getUser().getId();

        // 응답 보내기
        return productService.createProduct(requestDto, userId);
    }

위처럼 /api/products 란 주소로 POST 요청이 오면 컨트롤러에서 받아서 아래 함수를 실행해 준다 .

화면에서는 로그인 되어있는 회원의 ID값을 가져와 새로운 product 개체를 생성한다. 이때 매개변수로 회원의 ID값을 넣어주고 Service에 요청을 보내는데 createProduct 함수를 실행하라고 전달 해 준다.

Service

서비스는 Controller로 부터 받은 요청을 실제로 처리하는 것을 말한다. 실제 데이터를 생성하거나, 읽어오거나, 업데이트 하거나, 삭제하는등의 정보 가공 역할을 한다. 흔히 CRUD라 부르는 작업을 서비스에서 처리하기 때문에 서비스가 실세라고 부르기도 한다. 또한 서비스는 컨트롤러와 데이터베이스의 중간에 위치한 중간다리 역할을 한다.

사용예시

public Product createProduct(ProductRequestDto requestDto, Long userId ) {
// 요청받은 DTO 로 DB에 저장할 객체 만들기
        Product product = new Product(requestDto, userId);

        productRepository.save(product);

        return product;
    }

앞서 컨트롤러에서 서비스에 로그인이 되어있는 회원의 아이디 값을 입력받아 새로운 정보를 생성하는 요청을 전달해 주었다. 그러면 서비스에서는 product라는 새로운 객체를 생성해 전달받은 매개변수를 넣고 productRepository에 저장해 준다. 이처럼 컨트롤러와 저장소인 데이터베이스 중간에서 중간다리 역할을 한다.

Repository

레포지토리란 Entity에 의해 생성된 데이터베이스에 접근하는 메서드 들을 사용하기 위한 인터페이스이다. 우리가 사용하는 SQL은 JAVA와 언어가 다르기 때문에 이 작업을 편하게 하기 위해서 우리는 JPA라는 인터페이스를 상속받아 사용할 수 있다. JPA를 상속받아 사용하면 우리는 아주 편하게 데이터베이스와 연동하며 정보를 주고 받을 수 있다.

사용예시

public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findAllByUserId(Long userId);
}

ProductRepository 라는 인터페이스를 만들고 JpaRepository를 상속받았다. 이때 우리는 Product와 Long타입을 명시해 줬는데 이는 우리가 미리 Product 클래스를 만들어 Entity로 사용했기 때문이다. Long타입은 primary key값으로 여기선 Id값을 의미한다.

@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Product {

    // ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // 반드시 값을 가지도록 합니다.
    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String image;

    @Column(nullable = false)
    private String link;

    @Column(nullable = false)
    private int lprice;

    //로그인한 유저의 관심상품만 불러오기위해 컬럼을 추가해줌.
    @Column(nullable = false)
    private Long userId;

다음과 같이 Product클래스를 만들어 Entity를 선언해 각각의 Column에 해당하는 열을 만들어 주어 데이터베이스에 저장 해 준다고 선언해 놓았다. 그리고 Id값을 자동으로 증가시켜서 넣어주기로 선언해 놓았기 때문에 Repository를 이용해 저장할 때 키 값으로 저장된다.

'공부 > 자료조사' 카테고리의 다른 글

Maven vs Gradle  (0) 2022.03.29
Spring vs Spring Boot  (0) 2022.03.28
DNS의 원리  (0) 2022.03.27
restAPI의 put 과 patch 는 어떤 차이점이 있을까요?  (0) 2022.03.26
JPA 가 무엇인가요?  (0) 2022.03.24