Spring Framework를 사용하다 보면 수많은 어노테이션(Annotation)을 접하게 된다. 어노테이션은 단순한 "주석"이 아니라 코드에 특별한 의미와 기능을 부여하는 강력한 도구다. Java 5부터 도입된 기능으로, 코드에 메타데이터를 제공하는 방법이다. @ 기호로 시작하며, 컴파일러나 런타임에게 특별한 지시사항을 전달한다.
어노테이션의 장점:
@RestController
public class ApiController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers(); // JSON으로 반환
}
}
@Controller + @ResponseBody의 결합이다@Controller에서 특정 메서드만 API로 사용할 때 유용하다@GetMapping("/users") // 조회
@PostMapping("/users") // 생성
@PutMapping("/users/{id}") // 전체 수정
@DeleteMapping("/users/{id}") // 삭제
@RequestMapping보다 명확하고 간결하다@GetMapping("/search")
public List<User> searchUsers(@RequestParam("name") String userName) {
// ?name=김철수 형태의 쿼리 파라미터 처리
}
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
// /users/123 형태의 URL에서 값 추출
}
@PostMapping("/users")
public User createUser(@RequestBody UserCreateRequest request) {
// HTTP 요청 본문의 JSON을 객체로 변환
}
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
@Bean 메서드들을 포함할 수 있다@Configuration 클래스 내에서 사용한다@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // 생성자가 하나면 생략 가능
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Autowired
@Qualifier("creditCardProcessor")
private PaymentProcessor paymentProcessor;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan의 조합이다@Component, @Service, @Repository, @Controller 등을 찾아 빈으로 등록한다@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false)
private String name;
}
@Id: 기본키(Primary Key)를 나타낸다@GeneratedValue: 기본키 값을 자동으로 생성한다@SpringBootTest
@Transactional
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void 사용자_생성_테스트() {
// 테스트 후 자동으로 롤백됨
}
}
@BeforeEach: 각 테스트 메서드 실행 전에 호출된다@AfterEach: 각 테스트 메서드 실행 후에 호출된다@NoArgsConstructor: 기본 생성자 생성@AllArgsConstructor: 모든 필드를 포함하는 생성자 생성@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository; // 생성자에 포함됨
private String optionalField; // 생성자에 포함되지 않음
}
final 필드나 @NonNull 필드만 포함하는 생성자를 생성한다@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor의 조합