JPA/Entity 어노테이션
@Entity
클래스가 JPA 엔티티임을 나타냅니다. 데이터베이스 테이블과 매핑되는 객체를 정의할 때 사용합니다.
@Entity
public class User {
// 필드들...
}
@Table
엔티티와 매핑될 테이블의 정보를 지정합니다. 테이블명, 스키마, 제약조건 등을 설정할 수 있습니다.
@Entity
@Table(name = "users",
uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User { }
@Id
엔티티의 기본 키(Primary Key)를 나타냅니다. 각 엔티티는 반드시 하나의 @Id를 가져야 합니다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@GeneratedValue
기본 키 값을 자동으로 생성하는 전략을 지정합니다. IDENTITY, SEQUENCE, TABLE, AUTO 전략을 사용할 수 있습니다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
필드와 데이터베이스 컬럼의 매핑 정보를 지정합니다. 컬럼명, 길이, null 허용 여부 등을 설정할 수 있습니다.
@Column(name = "user_name",
nullable = false,
length = 50)
private String username;
@PrePersist
엔티티가 데이터베이스에 저장되기 전에 실행될 메서드를 지정합니다. 생성일시 설정 등에 사용됩니다.
@PrePersist
public void prePersist() {
this.createdAt = LocalDateTime.now();
}
Controller/Web 어노테이션
@RestController
@Controller와 @ResponseBody를 합친 어노테이션입니다. RESTful 웹 서비스의 컨트롤러를 만들 때 사용합니다.
@RestController
@RequestMapping("/api/users")
public class UserController {
// 메서드들...
}
@RequestMapping
HTTP 요청을 특정 핸들러 메서드에 매핑합니다. URL 패턴, HTTP 메서드, 헤더 등을 지정할 수 있습니다.
@RequestMapping(value = "/users",
method = RequestMethod.GET)
public List getUsers() {
return userService.findAll();
}
@GetMapping
HTTP GET 요청을 처리하는 메서드를 지정합니다. @RequestMapping(method = RequestMethod.GET)의 축약형입니다.
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
HTTP POST 요청을 처리하는 메서드를 지정합니다. 주로 데이터 생성 작업에 사용됩니다.
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.save(user);
}
@PathVariable
URL 경로의 변수를 메서드 파라미터에 바인딩합니다. RESTful API에서 리소스 식별자를 받을 때 사용됩니다.
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long userId) {
return userService.findById(userId);
}
@RequestBody
HTTP 요청 본문을 자바 객체로 변환합니다. JSON 데이터를 받아서 객체로 매핑할 때 사용됩니다.
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.save(user);
}
Service/Component 어노테이션
@Service
비즈니스 로직을 담당하는 서비스 클래스임을 나타냅니다. @Component의 특수한 형태로 스프링 컨테이너에 빈으로 등록됩니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findById(Long id) {
return userRepository.findById(id);
}
}
@Repository
데이터 액세스 계층의 클래스임을 나타냅니다. 데이터베이스 예외를 스프링의 DataAccessException으로 변환해줍니다.
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager entityManager;
public User findById(Long id) {
return entityManager.find(User.class, id);
}
}
@Component
스프링이 관리하는 컴포넌트임을 나타냅니다. 스프링 컨테이너에 빈으로 등록되어 의존성 주입이 가능해집니다.
@Component
public class EmailService {
public void sendEmail(String to, String subject, String body) {
// 이메일 전송 로직
}
}
@Autowired
스프링이 자동으로 의존성을 주입해줍니다. 타입을 기준으로 매칭되는 빈을 찾아서 주입합니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// 또는 생성자 주입 (권장)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Transactional
메서드나 클래스에 트랜잭션을 적용합니다. 메서드 실행 중 예외가 발생하면 자동으로 롤백됩니다.
@Service
@Transactional
public class UserService {
@Transactional(readOnly = true)
public User findById(Long id) {
return userRepository.findById(id);
}
public User save(User user) {
return userRepository.save(user);
}
}
Configuration 어노테이션
@Configuration
스프링 설정 클래스임을 나타냅니다. @Bean 메서드를 포함하여 스프링 컨테이너에 빈을 등록할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Bean
메서드가 스프링 컨테이너에 등록될 빈을 생성함을 나타냅니다. @Configuration 클래스 내에서 사용됩니다.
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
return dataSource;
}
}
@Value
프로퍼티 파일의 값을 필드에 주입합니다. application.properties나 환경변수의 값을 사용할 수 있습니다.
@Component
public class DatabaseConfig {
@Value("${spring.datasource.url}")
private String databaseUrl;
@Value("${app.name:MyApp}")
private String appName; // 기본값 설정
}
@Profile
특정 프로파일에서만 활성화되는 빈이나 설정을 지정합니다. 개발, 테스트, 운영 환경을 구분할 때 사용됩니다.
@Configuration
@Profile("production")
public class ProductionConfig {
@Bean
public DataSource dataSource() {
// 운영환경용 데이터소스 설정
}
}
Validation 어노테이션
@Valid
객체의 유효성 검증을 수행합니다. 컨트롤러 메서드의 파라미터에 사용하여 요청 데이터를 검증할 수 있습니다.
@PostMapping("/users")
public User createUser(@Valid @RequestBody User user) {
return userService.save(user);
}
@NotNull
필드가 null이 아님을 검증합니다. 필수 입력 필드에 사용됩니다.
public class User {
@NotNull(message = "이름은 필수입니다")
private String name;
}
@NotBlank
문자열이 null이 아니고 공백이 아님을 검증합니다. 빈 문자열과 공백만 있는 문자열도 검증에 실패합니다.
public class User {
@NotBlank(message = "사용자명은 필수입니다")
private String username;
}
@Email
이메일 형식이 올바른지 검증합니다. 정규표현식을 사용하여 이메일 패턴을 확인합니다.
public class User {
@Email(message = "올바른 이메일 형식이 아닙니다")
private String email;
}
@Size
문자열, 배열, 컬렉션의 크기를 검증합니다. 최소값과 최대값을 지정할 수 있습니다.
public class User {
@Size(min = 2, max = 30, message = "이름은 2-30자 사이여야 합니다")
private String name;
}
Testing 어노테이션
@SpringBootTest
스프링 부트 애플리케이션의 통합 테스트를 위한 어노테이션입니다. 전체 애플리케이션 컨텍스트를 로드합니다.
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void testFindUser() {
// 테스트 코드
}
}
@WebMvcTest
웹 계층만 테스트하기 위한 어노테이션입니다. 컨트롤러와 관련된 빈들만 로드하여 빠른 테스트가 가능합니다.
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
}
@MockBean
스프링 애플리케이션 컨텍스트에 Mock 객체를 빈으로 등록합니다. 테스트에서 실제 빈 대신 Mock을 사용할 때 활용됩니다.
@SpringBootTest
class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
}
Lombok 어노테이션
@Getter
모든 필드에 대한 getter 메서드를 자동으로 생성합니다. 클래스나 필드 레벨에서 사용할 수 있습니다.
@Getter
public class User {
private String name;
private String email;
// getName(), getEmail() 메서드가 자동 생성됨
}
@Setter
모든 필드에 대한 setter 메서드를 자동으로 생성합니다. 불변 객체를 만들 때는 사용을 피하는 것이 좋습니다.
@Setter
public class User {
private String name;
private String email;
// setName(), setEmail() 메서드가 자동 생성됨
}
@NoArgsConstructor
매개변수가 없는 기본 생성자를 자동으로 생성합니다. JPA 엔티티에서 필수적으로 사용됩니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class User {
// 기본 생성자가 protected로 생성됨
}
@AllArgsConstructor
모든 필드를 매개변수로 받는 생성자를 자동으로 생성합니다.
@AllArgsConstructor
public class User {
private String name;
private String email;
// User(String name, String email) 생성자가 자동 생성됨
}
@Builder
빌더 패턴을 자동으로 생성합니다. 객체 생성 시 가독성이 좋고 선택적 매개변수를 쉽게 처리할 수 있습니다.
@Builder
public class User {
private String name;
private String email;
}
// 사용 예시
User user = User.builder()
.name("홍길동")
.email("[email protected]")
.build();