[260701]필수로 알아야하는 기초 어노테이션

이상민·2026년 7월 1일

Spring

목록 보기
36/63

Spring 개발 시 알아야하는 어노테이션

Spring은 어노테이션을 기반으로 하는 프레임워크이기 때문에, 자주 사용하는 필수 어노테이션에 대해 숙지하는것이 중요하다. 오늘은 직접 CRUD코드를 구현하며, 자주 사용했던 어노테이션이 무엇이 있는지, 또한 어떤 역할을 하는지를 정리해보았다.


@RestController

REST API 개발 시 사용하게되는 가장 대표적인 어노테이션이다.
이는 @Controller와 @ResponseBody가 합쳐진 어노테이션으로, 반환값을 JSON형태로 자동 변환해주는 역할을 한다.

@Service

비즈니스 로직을 처리하는 서비스임을 나타낸다.
이는 MVC 패턴으로 코드를 작성할시, Controller와 Repository사이 중간 역할을 수행한다.

@Repository

데이터베이스 접근을 담당하는 클래스이다.

public interface testRepository extends JpaRepository<Test,Long>{
}

이와 같이 JpaRepository를 extends하여 findById와 같은 각종 기능을 사용 가능하게 해준다.

Entity

JPA에서 데이터베이스 테이블과 매핑되는 객체임을 의미한다. 데이터베이스 테이블을 Spring형식으로 표현하는 객체라고 생각하면 편하다.


@GetMapping, @PostMapping, @PutMapping, @DeleteMapping

이는 HTTP 요청을 처리하기 위한 어노테이션이다.
순서대로,
@GetMapping(basedUrl/{id}) = 조회
@PostMapping = 생성
@PutMapping(basedUrl/{id}) = 수정
@DeleteMapping(/{id}) = 삭제
의 역할을 담당한다.

@RequestMapping

이는 자주 사용되는 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) {}
}

@RequestBody, @RequestParam, @PathVariable

이 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에 저장된다.


@Id, @GeneratedValue

이 둘은 Entity의 기본키(@Id)를 지정하고 기본키가 어떻게 생성되는지(@GenerattedValue)에 대해 설정하는 어노테이션이다.

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id;

이런식으로 어노테이션을 작성해주면, id가 기본키가 되고 DB가 자동으로 값을 생성하게 된다.


@Transactional

이는 코드를 하나의 트랜잭션으로 처리한다.

@Transactional 
public void updateSchedule() {
	.
    .
    .
}

위와 같은 코드를 실행할때, updateSchedule()에서 하나의 오류라도 발생하게 된다면, 모든 작업을 롤백하여 데이터베이스에 영향을 미치지 않게한다.


@NoArgsConstructor, @AllArgsConstructor, @RequiredConstructor

위 어노테이션들은 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; }
profile
백앤드 개발 브이로그

0개의 댓글