[SpringBoot] @어노테이션 1

Oksun Noh·2024년 12월 18일
0

Spring & Spring Boot

목록 보기
1/6

작성 방법은 간단하다.

  1. 어노테이션 명
  2. 언제 사용해야하는가?
  3. 코드 예시

@Component & @Service & @Repository

  1. @Compoment : 일반적인 스프링 빈(스프링에서 사용할 코드)을 정의하는 어노테이션으로, 특정한 역할이 정해지지 않은 객체이 사용

  2. @Service : @Component로 동일한 기능을 하나, 서비스 계층의 컴포넌트를 의미함

  3. @Repository : @Component로 동일한 기능을 하나, 데이터 접근 계층의 컴포넌트를 의미함

    • 데이터 베이스와의 상호작용을 주로 한다고 생각하면 됨 (저장, 생성 등등..)
// 일반적인 컴포넌트
@Component
public class MyComponent {
    public void doSomething() {
    }
}

// 서비스 계층
@Service
public class MyService {
    public void executeService() {
    }
}

// 데이터 접근 계층
@Repository
public class MyRepository {
    public void saveData() {
    }
}

@Controller & @Re~~~

  1. @Controller: MVC(Model-View-Controller)의 컨트롤러 역할을 한다는 것을 정의하는 어노테이션으로, 주로 클라이언트의 요청이나, 적절한 응답반환하는 클래스에 사용
    • 어노테이션을 선언할 경우 Get/Post/Delete/Put Mapping 어노테이션 사용 가능 (코드예시 참조

  1. @ResponseBody: 반환 값ㅇ르 HTTP 응답 본문에 직접 작성 --> 쉽게 말해서 출력해서 보여준다는 것으로 생각하면 됨

  2. @RequestMapping: 기본 URL경로로 각 Mapping어노테이션의 기본경로를 설정(코드예시 참조)

    • 해당 어노테이션을 사용할 경우, 주소값이 동일하더라도 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

  1. @Configuration: 스프링 부트에 등록되지 않은 클래스, 즉 설정 클래스를 정의하는데 사용

    • 말이 너무 어려우니 내 식대로 풀이하면, 설정 클래스 --> 내가 만든 클래스라고 생각하면 됨
    • 해당 크래
  2. @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());
    }
}
profile
저는 만두를 좋아합니다

0개의 댓글