스프링 부트는 여러 어노테이션을 통해 개발자들이 코드의 간결성과 생산성을 높일 수 있도록 돕습니다.
spring-web
이 있으면 웹 관련 설정 자동 추가.@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@RestController : RESTful 웹 서비스를 쉽게 개발할 수 있도록 지원.
HTTP 매핑 어노테이션
예시
@RestController
public class ApiController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
@PostMapping("/data")
public Data saveData(@RequestBody Data data) {
return data;
}
}
@Autowired
스프링이 관리하는 빈을 클래스의 필드, 생성자, 또는 세터에 주입.
필드 주입
@Service
public class MyService {
@Autowired
private MyRepository repository;
}
생성자 주입(권장)
@Service
public class MyService {
private final MyRepository repository;
public MyService(MyRepository repository) {
this.repository = repository;
}
}
세터 주입
@Service
public class MyService {
private MyRepository repository;
@Autowired
public void setRepository(MyRepository repository) {
this.repository = repository;
}
}
@Entity : 데이터베이스 테이블과 매핑되는 JPA 엔터티 클래스 선언.
필수 어노테이션: @Id(기본 키), @GeneratedValue(키 생성 전략).
예
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
@Repository
@Service : 비즈니스 로직을 처리하는 클래스에 사용.
스프링 빈으로 등록하며 다른 빈에서 주입 가능.
예
@Service
public class UserService {
private final UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
public User findUser(Long id) {
return repository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
}
}
@Configuration
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@ConfigurationProperties
외부 설정 파일(application.yml, application.properties) 값을 자바 객체로 바인딩.
예
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
// Getter, Setter
}
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Before method execution");
}
}
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public class FeatureService {
// Feature-specific logic
}