자세히 알아보는 스프링 부트의 계층 구조

스프링 부트는 강력한 프레임워크로, 애플리케이션을 구성하는 계층을 명확하게 구분합니다. 이 글에서는 이러한 계층에 대해 알아보도록 하겠습니다.



1. 표현 계층 (Presentation Layer)

표현 계층은 사용자와의 인터페이스를 담당하는 부분입니다. 웹 애플리케이션의 경우, 이곳에서 HTTP 요청을 받아 처리하고, 그에 따른 응답을 생성하여 반환하는 컨트롤러가 이 계층에 속하게 됩니다. 컨트롤러는 사용자의 요청을 알맞은 서비스 메서드로 전달하고, 서비스로부터 받은 결과를 사용자에게 적절한 형태로 전달하는 역할을 합니다.


@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public String getAllUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "users";
    }
}


위의 코드에서 UserController는 “/users” URL로 GET 요청이 오면 userService의 getAllUsers 메서드를 호출하여 모든 사용자의 정보를 가져와서 모델에 추가하고, “users” 뷰를 반환합니다.




2. 응용 계층 (Application Layer)

응용 계층은 비즈니스 로직을 처리하는 계층입니다. 여기서 비즈니스 로직이란 실제로 애플리케이션의 핵심 기능을 구현하는 코드를 의미합니다. 이 계층에는 서비스와 레포지토리 인터페이스가 포함됩니다. 서비스는 특정 비즈니스 로직을 수행하며, 필요한 데이터는 레포지토리를 통해 가져옵니다.

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}


위의 코드에서 UserService는 UserRepository를 사용하여 모든 사용자의 정보를 가져오는 비즈니스 로직을 수행합니다.




3. 도메인 계층 (Domain Layer)

도메인 계층은 비즈니스 로직을 표현하는 도메인 모델이 포함됩니다. 이는 엔티티, 값 객체, 도메인 서비스 등을 포함합니다. 도메인 모델은 애플리케이션의 핵심 비즈니스 로직을 나타내며, 일반적으로 데이터베이스의 테이블과 1:1로 매핑됩니다.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;
    // getters and setters
}


위의 코드에서 User 클래스는 사용자를 표현하는 도메인 모델이며, 데이터베이스의 users 테이블과 매핑됩니다.



4. 인프라스트럭처 계층 (Infrastructure Layer)

인프라스트럭처 계층은 애플리케이션의 기술적인 부분을 담당합니다. 이는 데이터베이스 연결, 파일 시스템, 네트워크 통신 등을 처리합니다. 이 계층에서는 실제로 데이터베이스에 접근하여 데이터를 조회, 저장, 수정, 삭제하는 코드가 구현됩니다.

public interface UserRepository extends JpaRepository<User, Long> {}


위의 코드에서 UserRepository 인터페이스는 JPARepository를 상속받아 User 엔티티와 관련된 CRUD 연산을 수행할 수 있는 메서드를 제공합니다.

이렇게 스프링 부트에서는 각 계층이 별도의 책임을 가지며, 이를 통해 코드의 유지보수성과 확장성을 높이는 구조를 가집니다. 계층 구조를 이해하고 올바르게 적용하면, 효율적이고 유연한 애플리케이션을 만들 수 있습니다.

이 글이 도움이 되셨다면, 언제든지 추가 질문을 남겨주세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다