Spring은 어노테이션을 기반으로 하는 프레임워크이기 때문에, 자주 사용하는 필수 어노테이션에 대해 숙지하는것이 중요하다. 오늘은 직접 CRUD코드를 구현하며, 자주 사용했던 어노테이션이 무엇이 있는지, 또한 어떤 역할을 하는지를 정리해보았다.
REST API 개발 시 사용하게되는 가장 대표적인 어노테이션이다.
이는 @Controller와 @ResponseBody가 합쳐진 어노테이션으로, 반환값을 JSON형태로 자동 변환해주는 역할을 한다.
비즈니스 로직을 처리하는 서비스임을 나타낸다.
이는 MVC 패턴으로 코드를 작성할시, Controller와 Repository사이 중간 역할을 수행한다.
데이터베이스 접근을 담당하는 클래스이다.
public interface testRepository extends JpaRepository<Test,Long>{
}
이와 같이 JpaRepository를 extends하여 findById와 같은 각종 기능을 사용 가능하게 해준다.
JPA에서 데이터베이스 테이블과 매핑되는 객체임을 의미한다. 데이터베이스 테이블을 Spring형식으로 표현하는 객체라고 생각하면 편하다.
이는 HTTP 요청을 처리하기 위한 어노테이션이다.
순서대로,
@GetMapping(basedUrl/{id}) = 조회
@PostMapping = 생성
@PutMapping(basedUrl/{id}) = 수정
@DeleteMapping(/{id}) = 삭제
의 역할을 담당한다.
이는 자주 사용되는 URL을 하나로 묶어주는 역할을 하는 어노테이션이다.
위에 기술된 어노테이션과 같이 사용하여 아래와 같이 사용한다.
@RestController
@RequestMapping("/schedules")
public class ScheduleController {
@GetMapping
public List<Schedule> findAll() {}
@PostMapping
public void create() {}
@GetMapping("/{id}")
public Schedule findById(@PathVariable Long id) {}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {}
}
이 3개의 어노테이션은 Controller에서 사용하는 어노테이션이다.
@RequestBody -> 클라이언트가 전달한 JSON데이터를 객체로 변환해준다
@PostMapping public void create(@RequestBody CreateScheduleRequestDto dto) { }
@RequestParam -> 쿼리형태의 파라미터를 받아올 때 사용한다.
@GetMapping public List<Schedule> findAll( @RequestParam(required = false) String name ) { }
위와 같은 코드의 경우, GET /schedules?name=kim와 같이 요청하면 된다. required = false의 경우는 요청값이 없어도 된다는 뜻이다.
@PathVariable
이는 URL경로에 포함된 값을 변수로 변환할때 사용한다.
@GetMapping("/{id}") public Schedule findById(@PathVariable Long id) { }
위와같은 코드에 GET /schedules/1 이라는 요청을 보내면 1값이 id에 저장된다.
이 둘은 Entity의 기본키(@Id)를 지정하고 기본키가 어떻게 생성되는지(@GenerattedValue)에 대해 설정하는 어노테이션이다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
이런식으로 어노테이션을 작성해주면, id가 기본키가 되고 DB가 자동으로 값을 생성하게 된다.
이는 코드를 하나의 트랜잭션으로 처리한다.
@Transactional
public void updateSchedule() {
.
.
.
}
위와 같은 코드를 실행할때, updateSchedule()에서 하나의 오류라도 발생하게 된다면, 모든 작업을 롤백하여 데이터베이스에 영향을 미치지 않게한다.
위 어노테이션들은 Lombok이라는 의존성을 주입하게 되면 사용할 수 있는 어노테이션 들이다.
@NoArgsConstructor -> 매개변수가 없는 생성자를 생성한다.
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
private Long id;
private String name;
}
//자동으로 생성되는 코드
public User(){
}
이렇게 생성자를 구현하지 않아도 자동으로 생성자를 생성해준다.
또한, 접근 제한자를 사용하여 접근 레벨을 설정해줄 수 있다. 보통은 PROTECTED를 사용하여 무분별하게 객체를 생성하지 못하게 만든다.
@AllArgsConstructor -> 모든 필드를 매개변수로 가지는 생성자를 생성한다.
@AllArgsConstructor
public class User {
private Long id; private
String name;
}
//자동으로 생성되는 코드
public User(Long id, String name){
this.id = id;
this.name = name;
}
@NoArgsConstructor과는 정 반대의 성격을 가진다. 위의 코드를 예시로 들어 실행하면, User의 id와 name에 대한 생성자를 만들어준다.
@RequiredArgsConstructor -> final 필드에 대한 생성자를 만든다.
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final ProductRepository productRepository;
private String name;
}
//자동으로 생성되는 코드
public UserService(
UserRepository userRepository,
ProductRepository productRepository
) {
this.userRepository = userRepository;
this.productRepository = productRepository; }