@Component는 스프링 프레임워크에서 제공하는 애노테이션 중 하나로, 주로 컴포넌트를 자동으로 스프링 빈으로 등록하기 위해 사용된다. 이것은 스프링의 어노테이션 기반 구성 메커니즘의 일부이다.
@Component가 달린 클래스들을 자동으로 스프링 빈으로 등록한다.@Component는 다른 세 가지 스테레오타입 애노테이션(@Service, @Repository, @Controller)의 기본 애노테이션이기도 하다.<!-- xml 파일-->
<context:component-scan base-package="com.example.components" />
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
public void doSomething() {
System.out.println("MyComponent is doing something.");
}
}
@Component로 마킹된 MyComponent는 스프링 컨테이너에 자동으로 빈으로 등록된다.<context:component-scan>을 사용하여 특정 패키지 내의 @Component를 스캔하도록 지정한다.@Service: 비즈니스 로직이 포함된 서비스 컴포넌트를 나타낸다. @Component의 파생형으로, 비즈니스 로직 클래스에 명시적 의미를 부여하기 위해 사용된다.@Repository: 데이터 접근 계층의 컴포넌트를 나타낸다. 이 애노테이션을 사용하면 예외 변환 등 데이터 관련 기능을 추가로 제공한다.@Controller: 웹 컨트롤러 계층을 나타낸다. 스프링 MVC의 요청 처리 메커니즘과 연동된다.@Component 애노테이션은 애플리케이션 구조를 개선하고 자동화를 통해 개발자 경험을 향상시키는 도구이다. 빈의 명확한 역할이 필요한 경우 다른 스테레오타입 애노테이션과 함께 사용하여 코드를 더 명확하고 유지 관리하기 쉽게 만들 수 있다.
@Service는 스프링 프레임워크에서 제공하는 어노테이션 중 하나로, 주로 서비스 계층의 빈을 표시하기 위해 사용된다. 이 어노테이션은 비즈니스 로직이 포함된 서비스 클래스를 나타내고, 특정 의미를 가진 스테레오타입 어노테이션 중 하나이다.
@Component와 기능적으로 동일하지만, 특정 역할을 나타내는 의미를 부여하기 위해 사용된다.@Service로 마킹된 클래스를 찾아 빈으로 등록한다.<context:component-scan> 또는 @SpringBootApplication을 통한 패키지 스캔으로 이루어진다.<!-- xml 파일-->
<context:component-scan base-package="com.example.services" />
import org.springframework.stereotype.Service;
@Service
public class MyService {
public void performBusinessLogic() {
System.out.println("Performing some business logic...");
}
}
@Service로 표시된 MyService는 자동으로 스프링 컨테이너에 등록된다.@Service로 명시된 클래스는 의존성 주입을 통해 테스트와 유지보수에 용이하다.Mock 객체는 행위를 검증하기 위해 사용되는 객체를 지칭하며, 수동으로 만들 수도 있고, Mock 프레임워크를 이용할 수도 있다. Mock 객체 라는 단어는 행위기반테스트를 위해 사용되는 객체보다 더 넓은 일반적인 '가상 임시 구현체'의 의미로 사용되는 경우가 더 많다.
@Transactional 어노테이션을 함께 사용하여, 서비스 계층에서 데이터의 일관성 보장을 위한 트랜잭션 경계를 설정할 수 있다.@Service를 사용한다.import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
public void updateUser(User user) {
userRepository.save(user);
}
}
@Service: UserService 클래스를 서비스 빈으로 등록한다.UserRepository를 서비스 클래스에 주입하여 데이터 접근을 담당한다.@Component: 모든 스테레오타입 애노테이션의 기본이 되는 어노테이션이다.@Repository: 데이터 접근 계층의 컴포넌트를 표시하며, 데이터 예외 변환 기능을 제공한다.@Controller: 웹 컨트롤러 계층을 나타내며, 스프링 MVC와 연동된다.@Service는 스프링 애플리케이션에서 명확한 역할 구분을 통해 코드 가독성을 높이고, 자동 빈 등록을 통해 개발 생산성을 높이는 데 기여하는 중요한 어노테이션이다.
@Repository는 스프링 프레임워크의 데이터 액세스 계층을 위한 어노테이션이다. 이 어노테이션은 데이터베이스와의 상호작용을 담당하는 클래스(주로 DAO 또는 리포지토리)에 붙여 사용하며, 스프링이 자동으로 빈으로 등록할 수 있도록 도와준다. 또한, 이 어노테이션을 사용하면 데이터 액세스 예외를 처리하는 추가 기능도 함께 제공된다.
@Component의 하위 어노테이션이기 때문에 스프링 컨테이너에서 빈으로 자동 등록된다.import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
@Repository: UserRepository 인터페이스를 리포지토리 빈으로 등록한다.Spring Data JPA: 위 예제는 JPA를 사용한 경우로, 리포지토리를 통해 CRUD 연산 및 커스텀 쿼리를 구현한다.JpaRepository, CrudRepository, MongoRepository 등 스프링 데이터 기반의 리포지토리 인터페이스에도 함께 사용된다.@Repository를 사용하면 스프링은 데이터베이스 연산 중 발생하는 체크드 예외를 스프링의 데이터 액세스 예외로 변환한다. 이러한 변환을 통해 애플리케이션의 다른 계층에서 데이터베이스 관련 예외를 쉽게 처리할 수 있게 한다.
@Repository는 스프링에서 데이터 액세스 계층을 설계할 때 일관된 방식으로 사용되며, 데이터 처리에 대한 유지보수와 예외 처리를 단순화하는 데 도움이 된다.
@Repository는 데이터 액세스 계층에서 활용되며, 데이터베이스나 다른 영구 저장소에 직접 접근하는 역할을 하는 클래스에 적용된다. 이를 통해 스프링 프레임워크는 해당 클래스를 빈으로 자동 등록하고, 데이터 액세스 관련 예외를 스프링의 데이터 액세스 예외로 변환할 수 있다.
// User.java (도메인 클래스)
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
// UserRepository.java (리포지토리 인터페이스)
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.model.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 커스텀 메서드 선언 예시
User findByUsername(String username);
}
// UserService.java (서비스 클래스)
package com.example.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserByUsername(String username) {
return userRepository.findByUsername(username);
}
public void createUser(User user) {
userRepository.save(user);
}
}
// UserController.java (컨트롤러 클래스)
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{username}")
public User getUser(@PathVariable String username) {
return userService.getUserByUsername(username);
}
@PostMapping
public void createUser(@RequestBody User user) {
userService.createUser(user);
}
}
이 구조에서 @Repository는 데이터베이스와의 상호작용을 위한 리포지토리 인터페이스에 사용되며, 스프링의 데이터 액세스 예외 변환 기능을 제공하여 데이터 액세스 계층의 구현을 간소화하고 안정적으로 만든다.
@Controller는 Spring MVC에서 웹 애플리케이션의 프레젠테이션 계층을 담당하는 컨트롤러 클래스를 정의하기 위해 사용되는 어노테이션이다. 이 어노테이션이 붙은 클래스는 웹 요청을 처리하고, 결과를 모델에 담아 뷰로 반환하는 역할을 한다.
@RestController는 기본적으로 JSON이나 XML 형태로 응답을 반환하지만, @Controller는 JSP, Thymeleaf 등의 뷰를 통해 사용자 인터페이스를 제공하는 데 주로 사용된다.import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
@Controller@GetMapping@RequestParamModelreturn "greeting"@Controller는 스프링의 웹 애플리케이션에서 사용자 인터페이스를 담당하는 중요한 역할을 한다. 이 어노테이션을 사용하여 프레젠테이션 계층을 구성하고, 뷰 템플릿과 함께 동작하여 웹 페이지를 동적으로 생성하는 데 사용된다.
// HomeController.java
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/home")
public class HomeController {
// /home/greet URL로 요청이 오면 이 메서드가 실행됩니다.
@GetMapping("/greet")
public String greet(@RequestParam(name = "name", required = false, defaultValue = "Guest") String name, Model model) {
// 모델에 데이터를 추가
model.addAttribute("greeting", "Hello, " + name + "!");
// greeting이라는 뷰로 이동 (예: greeting.html 또는 greeting.jsp)
return "greeting";
}
// /home/welcome URL로 요청이 오면 이 메서드가 실행됩니다.
@GetMapping("/welcome")
public String welcome(Model model) {
// 간단한 메시지를 모델에 추가
model.addAttribute("message", "Welcome to the Home Page!");
// welcome이라는 뷰로 이동 (예: welcome.html 또는 welcome.jsp)
return "welcome";
}
// /home/about URL로 요청이 오면 이 메서드가 실행됩니다.
@GetMapping("/about")
public String about() {
// about이라는 뷰로 이동
return "about";
}
}
@Controller@RequestMapping@GetMapping@RequestParamModel 객체
@RestController는 Spring MVC에서 RESTful 웹 서비스의 컨트롤러를 정의하는 데 사용되는 어노테이션이다.@Controller와@ResponseBody를 결합한 것으로, 반환된 값을 뷰로 렌더링하지 않고 직접 HTTP 응답 본문에 JSON, XML 등의 형태로 전송한다.
@RestController도 @Controller처럼 스프링 컨테이너에서 빈으로 관리된다.@RequestMapping과 함께 사용되며, HTTP 메서드별로 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등의 매핑 어노테이션을 활용하여 라우팅한다.// UserController.java
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
private static Map<Long, String> userStore = new HashMap<>();
private static long idCounter = 1;
// 간단한 Get 요청 예제
@GetMapping("/users/{id}")
public Map<String, Object> getUser(@PathVariable Long id) {
Map<String, Object> response = new HashMap<>();
String username = userStore.get(id);
if (username != null) {
response.put("id", id);
response.put("username", username);
} else {
response.put("error", "User not found");
}
return response; // 자동으로 JSON으로 변환되어 반환됩니다.
}
// 간단한 Post 요청 예제
@PostMapping("/users")
public Map<String, Object> createUser(@RequestBody Map<String, String> request) {
String username = request.get("username");
Map<String, Object> response = new HashMap<>();
if (username != null && !username.trim().isEmpty()) {
long newId = idCounter++;
userStore.put(newId, username);
response.put("id", newId);
response.put("username", username);
} else {
response.put("error", "Invalid username");
}
return response; // JSON으로 변환
}
}
@RestController@GetMapping, @PostMapping@PathVariable@RequestBody
@RestController는 RESTful 웹 서비스 개발에 있어서 데이터 API를 구축할 때 효과적이며, 특히 프론트엔드 애플리케이션과 데이터를 교환하는 백엔드 API에 적합하다.