본문 바로가기

SPRING

3Tier Architecture

Controller-Service-Repository 패턴

  • Spring Framework에서 가장 일반적인 아키텍처는 Controller-Service-Repository 패턴이다.
  • 이 패턴은 애플리케이션의 논리적인 계층을 분리해 유지보수성과 확장성을 향상시키는데 도움을 준다.

 

  1. Controller

: Controller는 웹 요청을 받아서 해당 요청을 처리할 Service를 호출하고, 그 결과를 다시 View에 전달하는 역할을 한다. Controller는 클라이언트로부터의 입력을 처리하며, Http 요청에 대한 응답을 생성한다.

@Controller
@RequestMapping("/example")
public class ExampleController {

    private final ExampleService exampleService;

    @Autowired
    public ExampleController(ExampleService exampleService) {
        this.exampleService = exampleService;
    }

    @GetMapping("/hello")
    public String hello(Model model) {
        String message = exampleService.getMessage();
        model.addAttribute("message", message);
        return "helloView";
    }
}

→ 위 코드에서 Controller 역할을 하는 ExampleController 클래스가 있다.

  • Controller에서는 ExampleService 객체를 생성자를 통해 주입받아서, Service를 호출한다.
  • 이후 View에서 사용할 데이터를 Model에 저장하고, View의 이름을 반환해 해당 View로 이동한다.

 

2. Service

: Service는 비즈니스 로직을 수행하는 역할을 한다. Service는 Repository를 사용해 데이터에 접근하고, 그 결과를 다시 Controller에 전달한다. Service는 보통 여러 개의 Repository를 사용해 데이터를 처리한다.

@Service
public class ExampleService {

    private final ExampleRepository exampleRepository;

    @Autowired
    public ExampleService(ExampleRepository exampleRepository) {
        this.exampleRepository = exampleRepository;
    }

    public String getMessage() {
        String message = exampleRepository.getMessage();
        return "Hello " + message + "!";
    }
}

→ 위 코드에서는 Service 역할을 하는 ExampleService 클래스가 있다. Service에서는 ExampleRepository 객체를 생성자를 통해 주입받아서, Repository를 사용해 데이터를 처리한다.

이후 Controller에 반환할 데이터를 생성해 반환한다.

 

 

3.Repository

: Repository 는 데이터에 접근하는 역할을 한다. Repository는 데이터베이스나 파일, 메모리 등 다양한 데이터 저장소에 접근하는 기능을 제공한다. Repository는 보통 DAO(Data Access Object)로 불리기도 한다.

@Repository
public class ExampleRepository {

    public String getMessage() {
        return "World";
    }
}

→ 위 코드에서 Repository 역할을 하는 ExampleRepository 클래스가 있다.

Repository에서는 데이터에 대한 접근 메서드를 제공한다.→ 위의 예제에서는 getMessage() 메서드

 

 

위와 같이 Controller-Service-Repository 패턴을 사용하면, 각 계층의 역할이 분리되므로 유지 보수성과 확장성이 높아진다.

 

 


[ 정리 ] 

 

Controller → Service → Repository

  • controller는 사용자의 요청을 처리하는 로직을 수행한다.
  • Service는 사용자의 요청과 Repository의 간극을 해결하는 로직을 수행한다.
    • ex) 사용자의 요청이 글 삭제일 때, 레포지토리에서는 글 삭제와 댓글 삭제 두가지를 수행해야 한다.
  • Repository에서는 데이터에 접근하는 역할을 한다.

 

 

'SPRING' 카테고리의 다른 글

HTTP 요청 메서드 ( GET / POST )  (0) 2024.02.08
Artillery를 활용한 부하 테스트  (0) 2024.02.02