작성 방법은 간단하다.
@Compoment : 일반적인 스프링 빈(스프링에서 사용할 코드)을 정의하는 어노테이션으로, 특정한 역할이 정해지지 않은 객체이 사용
@Service : @Component로 동일한 기능을 하나, 서비스 계층의 컴포넌트를 의미함
@Repository : @Component로 동일한 기능을 하나, 데이터 접근 계층의 컴포넌트를 의미함
// 일반적인 컴포넌트
@Component
public class MyComponent {
public void doSomething() {
}
}
// 서비스 계층
@Service
public class MyService {
public void executeService() {
}
}
// 데이터 접근 계층
@Repository
public class MyRepository {
public void saveData() {
}
}
@ResponseBody: 반환 값ㅇ르 HTTP 응답 본문에 직접 작성 --> 쉽게 말해서 출력해서 보여준다는 것으로 생각하면 됨
@RequestMapping: 기본 URL경로로 각 Mapping어노테이션의 기본경로를 설정(코드예시 참조)
@RestController // Controller + ReponseBody
@RequestMapping("/api/v1/posts") // 기본 URL 경로
@RequiredArgsConstructor // 2단계에서 설명
public class ApiV1PostController {
private final PostService postService;
//기본 경로
@GetMapping // http://localhost:8085/api/v1/posts
public List<Post> getItems() {
return postService.findAllByOrderByIdDesc();
}
// Get 요청을 통해 모든 게시글을 조회
@GetMapping("/{id}") // http://localhost:8085/api/v1/posts/{id값}
public Post getItem(
@PathVariable long id
) {
return postService.findById(id).get();
}
// Get 요청을 통해 특정 id값을 가진 게시물 조회
@DeleteMapping("/{id}") // http://localhost:8085/api/v1/posts
public RsData deleteItem(
@PathVariable long id
) {
Post post = postService.findById(id).get();
postService.delete(post);
return new RsData(
"200-1",
"%d번 글을 삭제하였습니다.".formatted(id)
);
}
record PostModifyReqBody(
@NotBlank
@Length(min = 2)
String title,
@NotBlank
@Length(min = 2)
String content
) {
}
// Put 요청을 통해 특정 id값을 가진 게시물 내용을 수정
@PutMapping("/{id}")
@Transactional
public RsData modifyItem(
@PathVariable long id,
@RequestBody @Valid PostModifyReqBody reqBody
) {
Post post = postService.findById(id).get();
postService.modify(post, reqBody.title, reqBody.content);
return new RsData(
"200-1",
"%d번 글이 수정되었습니다.".formatted(id)
);
}
@Configuration: 스프링 부트에 등록되지 않은 클래스, 즉 설정 클래스를 정의하는데 사용
@Bean: @Configuration 이 설정된 클래스의 매서드가 반환하는 객체를 스프링의 '빈'으로 등록하여 다른 클래스에서 사용하기 편하게 만들어주는 어노테이션
@Configuration
public class AppConfig {
@Bean
public User user() {
// User 객체를 생성하여 빈으로 등록
return new User("John Doe", 30); // 이름: John Doe, 나이: 30
}
}
@Service
public class UserService {
private final User user;
@Autowired // User 빈을 주입하여 값을 빠르게 불러올 수 있음
public UserService(User user) {
this.user = user;
}
public void printUserInfo() {
System.out.println("사용자 이름: " + user.getName() + ", 나이: " + user.getAge());
}
}
// 빈을 사용하지 않을 경우
@Service
public class UserService {
private final User user;
// 생성자에서 User 객체와 값을 수동으로 생성, 해당 객체를 사용하고자 하는 곳에서 계속 생성해야 함
public UserService() {
this.user = new User("John Doe", 30);
}
public void printUserInfo() {
System.out.println("사용자 이름: " + user.getName() + ", 나이: " + user.getAge());
}
}