[Spring] @Controller, @Service, @Component, @Repository의 차이

mi-fasol·2023년 11월 16일
0

Spring

목록 보기
4/4

요즘 스프링 부트를 공부해 보고 싶다는 생각이 많이 들어서, 기본 개념부터 차근차근 다시 짚고 넘어가려고 한다.

Controller와 Service, Component, Repository는 스프링을 사용하면서 가장 많이 사용하는 어노테이션이다.
코드를 작성하며 사용하기는 했지만, 어떻게 작동되고 어떤 기능을 하는지는 정확히 알지 못해서 공부할 겸 정리하고자 포스팅을 한다.

우선 설명에 앞서, 위의 네 가지를 어노테이션이라고 하는데 스프링 코드에 메타데이터를 제공하여 스프링 컨테이너가 해당 클래스나 메서드를 어떻게 처리해야 하는지를 알려주는,기능을 수행하게 하는 주석이다.

우리는 어노테이션을 사용하여 코드를 더 짧고 효율적으로, 유지보수에 용이하게 작성할 수 있다.

가장 기본적인 @Repository 어노테이션부터 살펴보자.

@Repository

Repository 어노테이션은 데이터 액세스 계층의 구성 요소를 다루는 어노테이션이다.

아래와 같은 특징을 가지고 있다.

  • 데이터베이스와의 상호작용을 담당
  • Persistence Layer에 존재
  • 주로 DAO(Data Access Object) 클래스에 사용되는 어노테이션
  • 스프링에서 지원하지 않는 특정 예외를 Spring Exception으로 전환
  • 예외 발생 시 Unchecked Exception을 DataAccessException으로 변경하여 처리

Repository 어노테이션의 개념과 특징에 대해서 간단히 설명을 했으니 사용법에 대해 알아보자.

import org.springframework.stereotype.Repository;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

@Repository
public class ExampleRepository {

    private final JdbcTemplate jdbcTemplate;


	 @Autowired
    public ExampleRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public String getNameById(Long id) {
        String sql = "SELECT name FROM my_table WHERE id = ?";
        
        try {
        
            // JDBC로 id를 통해 name 필드 가져오기
            return jdbcTemplate.query(sql, new Object[]{id}, (ResultSetExtractor<String>) rs -> {
                if (rs.next()) {
                    return rs.getString("name");
                }
                return null;
            });
        } catch (DataAccessException ex) {
            // 예외 처리
            throw ex;
        }
    }
}

위의 코드처럼 class 위에 어노테이션을 붙여주면 끝이다.

@Autowired로 의존성을 주입해준 코드는 아래와 같이 변경할 수 있으나, 어노테이션으로 주입해주는 걸 추천한다.

    public ExampleRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

SpringBoot에서 JPA를 사용하여 Repository를 사용하는 건 더 간단하다.
어노테이션을 붙일 필요 없이 아래와 같이 작성해주면 된다.

public interface UserRepository extends JpaRepository<User, Long> {
    User findByNickname(String nickname);

    Boolean existsByNickname(String Nickname);
}

어노테이션을 사용할 필요 없이 JPARepository를 사용해주면 된다.

그럼 다음으로 Service 어노테이션에 대해 알아보자.

@Service

Service 어노테이션은 해당 클래스가 비즈니스 로직을 담당하는 서비스 계층 구성 요소임을 알려주는 어노테이션이다.

아래와 같은 특징을 가지고 있다.

  • 주로 Service Layer 클래스에 사용
  • 스프링 컨테이너에 해당 클래스를 빈으로 등록
  • 스프링의 트랜잭션 관리를 받음
  • 비즈니스 로직을 가지고 있음

개념과 특징을 알았으니, 코드로 살펴보자.

@Service
public class UserService {

    @Autowired
    UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }
}

위에 보이는 것처럼 클래스 위에 어노테이션을 사용해 주면 된다.

서비스 클래스는 기능의 처리와 관련된 부분을 작성해야 한다.
서비스 클래스에서 비즈니스 요구사항을 구현하면, 후에 나올 컨트롤러에서 서비스 클래스의 함수를 호출해주는 형식으로 작성이 이루어져야 한다.

@Component

Component 어노테이션은 스프링 IoC 컨테이너가 해당 클래스를 자동으로 빈으로 인식하고, 필요한 곳에 주입하거나 관리할 수 있게 하는 어노테이션이다.

아래의 특징이 있다.

  • 빈을 등록하고 자동으로 검색 및 등록 가능
  • 스프링이 클래스의 의존성을 관리하며 필요한 곳에 자동으로 의존성 주입
  • @Repository, @Service. @Controller는 모두 @Component를 확장한 어노테이션

설명은 이 정도면 끝일 것 같고, 앞서 했던 것처럼 코드로 확인해보자.

@Component
public class User {
	public User() {
		System.out.println("Component Example");
    }
}

이렇게 사용해주면 User 클래스를 스프링 컨테이너가 빈으로 인식하게 되고, 의존성을 주입한다.

@Controller

Controller 어노테이션은 해당 클래스가 웹 어플리케이션 요청을 처리하는 컨트롤러임을 나타내는 어노테이션이다.

아래의 특징이 있다.

  • 웹 어플리케이션에서 클라이언트의 요청을 처리하는 컨트롤러 역할
  • @RequestMapping 어노테이션으로 컨트롤러에서 처리하는 요청의 기본 경로 지정 가능
  • 메서드 수준에서 어떤 경로의 요청을 처리할지 지정 가능
  • @Component 어노테이션을 구체화 한 것으로, 해당 클래스를 IoC 컨테이너에 빈 등록

컨트롤러에는 자주 사용되는 어노테이션이 있는데, 대표적으로 몇 가지만 알아보자.

어노테이션목적설명
@RequestMappingURI로 요청이 오면, 어떤 메서드로 처리할지 매핑헤더 등 지정 가능
@GetMappingHTTP GET 메서드에 대한 요청을 처리CRUD의 Read
@PostMappingHTTP POST 메서드에 대한 요청을 처리CRUD의 Create
@PutMappingHTTP PUT 메서드에 대한 요청을 처리CRUD의 Update
@DeleteMappingHTTP DELETE 메서드에 대한 요청을 처리CRUD의 Delete

그럼, 마지막으로 코드로 살펴보자.

@Controller
public class ExampleController {

    @RequestMapping("/example")
    public String example() {
        return "example";
    }
}

이런 식으로 사용해주면 된다.

Controller 말고도 @RestController라는 어노테이션이 존재하는데, @Controller는 JSP 등의 View 템플릿 엔진을 사용하여 HTML 페이지를 넘겨주지만, @RestController는 RESTful API를 제공하는 컨트롤러에서 사용된다는 차이점이 있다.


오늘은 이렇게 Spring의 MVC를 위한 기초 어노테이션에 대해서 알아봤다.
원래는 Bean에 대해서도 작성할까 헀지만, 너무 길어질 것 같아 다음 포스팅에서 다루기로 하자.

profile
정위블

0개의 댓글