자바 Controller, Service, Repository 구조 (1) 에서 잘 모르는 개념, 용어들이 나와서 추가적으로 정리할 필요가 있다고 느꼈습니다.

https://velog.io/@davinyakma/[TIL] 자바 Controller, Service, Repository 구조 (1)


레이어드 아키텍처 (Layered Architecture)

레이어드 아키텍처는 애플리케이션을 역할별로 계층화하여 관리하는 소프트웨어 설계 방식입니다. 이는 역할 분리를 통해 유지보수성과 확장성을 높이는 데 도움을 줍니다.

대표적인 계층 구성:

  1. Presentation Layer (Controller):

  • 사용자의 요청을 받고 응답을 처리.
  • 예: HTTP 요청을 받고 JSON 응답을 반환.
  1. Business Logic Layer (Service):

  • 애플리케이션의 핵심 로직을 처리.
  • 데이터 처리나 계산, 로직 수행.
  1. Data Access Layer (Repository):

  • 데이터베이스와 상호작용.
  • CRUD 작업 수행 (Create, Read, Update, Delete).

장점:

  • 역할 분리: 각 계층이 독립적이므로 코드의 가독성이 증가.
  • 유지보수 용이: 특정 계층의 변경이 다른 계층에 영향을 덜 미칩니다.
  • 테스트 용이: 계층별로 독립적인 단위 테스트가 가능합니다.

레이어드 아키텍쳐
이미지 출처


Spring MVC 애노테이션

Spring MVC에서는 각 계층의 역할에 맞는 애노테이션을 제공하여 개발자들이 코드의 의도를 명확히 하고, 프레임워크가 자동으로 동작을 연결할 수 있게 해줍니다.

  1. @RestController / @Controller

  • @RestController: JSON 또는 XML 형식의 데이터를 반환하는 API를 개발할 때 사용.

  • @Controller: JSP 같은 뷰(View) 페이지를 반환할 때 사용.

    @RestController
    @RequestMapping("/api") // "/api"로 시작하는 모든 요청을 처리
    public class UserController {
    
        @GetMapping("/users") // GET 요청 처리
        public List<User> getAllUsers() {
            return userService.getAllUsers();
        }
    }
  1. @RequestMapping

  • 클래스나 메서드에 요청 URL을 매핑하는 데 사용.
  • 주로 HTTP 메서드(GET, POST 등)와 결합하여 세부 요청을 처리.
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public List<User> getUsers() {
        return userService.getAllUsers();
    }
  1. @GetMapping, @PostMapping 등

  • HTTP 메서드(GET, POST 등) 별로 요청을 매핑.

  • @RequestMapping보다 간결하게 사용 가능.

    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.getAllUsers();
    }
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }

사용자 입력 검증

Spring MVC에서는 입력 데이터 검증을 쉽게 처리할 수 있는 여러 애노테이션과 방법을 제공합니다.

  1. @RequestParam

  • URL 쿼리 파라미터를 매핑.
  • 필수 여부와 기본값 지정 가능.
    @GetMapping("/users")
    public String getUserById(@RequestParam(value = "id", required = true) Long id) {
        return "User ID: " + id;
    }
  1. @PathVariable

  • URL 경로의 일부를 변수로 매핑.
    @GetMapping("/users/{id}")
    public String getUserById(@PathVariable Long id) {
        return "User ID: " + id;
    }
  1. @RequestBody

    HTTP 요청의 본문(body) 데이터를 객체로 매핑.
    주로 JSON 데이터를 처리할 때 사용.

    @PostMapping("/users")
    public String createUser(@RequestBody User user) {
        return "Created User: " + user.getName();
    }

단일 책임 원칙 (SRP: Single Responsibility Principle)

단일 책임 원칙이란, 하나의 클래스나 메서드는 하나의 역할만 수행해야 한다는 원칙입니다.

  • 코드의 가독성, 유지보수성을 높이는 중요한 원칙입니다.
  • 예:
    • 컨트롤러는 요청을 받고 응답을 반환하는 역할만 수행.
    • 서비스는 비즈니스 로직만 처리.
    • 리포지토리는 데이터베이스와의 통신만 담당.

의존성 주입 (DI: Dependency Injection)

의존성 주입은 객체 간의 의존성을 프레임워크가 자동으로 관리해주는 개념입니다.
Spring에서는 주로 생성자 주입을 사용합니다.

생성자 주입 예제

@RestController
public class UserController {

    private final UserService userService;

    // 의존성 주입: UserService 객체를 컨트롤러에 전달
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

장점:

  • 객체 생성을 개발자가 직접 관리할 필요 없음.
  • 유연한 테스트 환경 구성 가능 (e.g., Mock 객체 주입).

데이터 접근 기술 (JPA, MyBatis, JDBC)

JPA (Java Persistence API):

  • 자바의 ORM(Object Relational Mapping) 표준.
  • 객체 지향 방식으로 데이터베이스를 다룰 수 있음.
  • Spring Data JPA는 JPA를 쉽게 사용할 수 있도록 지원.
    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
        List<User> findByLastName(String lastName);
    }

MyBatis:

  • SQL을 직접 작성하면서 데이터 매핑을 지원하는 프레임워크.
  • 데이터 처리와 SQL 사용이 용이하지만 코드가 더 복잡해질 수 있음.
    <select id="getUserById" parameterType="long" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>

JDBC:

  • 자바에서 데이터베이스에 접근할 수 있는 표준 API.

  • SQL을 직접 작성해야 하고, 코드가 길어질 수 있음.

    Connection connection = DriverManager.getConnection(url, username, password);
    PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
    statement.setLong(1, id);
    ResultSet rs = statement.executeQuery();

JPA나 JDBC, Domain, DTO 등등 기술은 백엔드를 더 공부하면서 배울 것입니다!

profile
다 먹어버릴거야!

0개의 댓글