[SpringBoot]UploadExample모르는거 정리

맨큐의 경제학9판·2025년 1월 21일
0

Q1)

@Entity

public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="id")
    private Long id;
    @Column(name = "title")
    private String title;
    @Column(name = "content")
    private String content;

    protected  Article(){  }

    @Builder
    public Article(String title, String content){
        this.title = title;
        this.content= content;
    }

}

여기서 왜

protected  Article(){  }

    @Builder
    public Article(String title, String content){
        this.title = title;
        this.content= content;
    }

이런 코드를 어떤생각으로 도출해내는건지 모르겠다.

A1)대충 결론부터 말하면 JPA프레임워크에서 요구하는 코드라고 한다. 조금더 자세히 말하면

JPA는 엔티티 객체를 생성하고 관리하기 위해 리플렉션(Reflection) 이라는 기술을 사용합니다. 리플렉션을 통해 클래스의 정보를 가져오고 객체를 생성하는데, 이때 기본 생성자가 필요합니다. protected 접근 제어자는 외부에서 직접 객체를 생성하는 것을 막으면서도 JPA가 내부적으로 객체를 생성할 수 있도록 허용합니다.

이런 이유 때문이라고 한다.

@Getter
@Setter
public class AddArticleRequest {
 private Long id;
 private String title;
 private String content;
 public Article toEntity(){
   return  Article.builder()
           .title(title)
           .content(content)
           .build();

 }
}

여기(DTO)에서 toEntity()메서드 쓰는 이유도 물어봤다

DTO(Data Transfer Object)는 계층 간 데이터 교환을 위해 사용되는 객체입니다. 즉, 레이어 간 데이터를 주고받을 때 사용하는 객체를 의미합니다. 예를 들어, 컨트롤러에서 서비스 계층으로 데이터를 전달하거나, 서비스 계층에서 데이터베이스에 데이터를 저장할 때 DTO를 사용할 수 있습니다.

toEntity() 메서드는 DTO (Data Transfer Object) 객체를 엔티티 객체로 변환하기 위해 만든 메서드입니다.
DTO는 계층 간 데이터 교환을 위한 객체이고, 엔티티는 데이터베이스에 저장되는 객체입니다. DTO와 엔티티는 역할과 구조가 다르기 때문에, DTO를 엔티티로 변환하는 작업이 필요합니다.
toEntity() 메서드는 DTO 객체의 데이터를 사용하여 새로운 Article 엔티티 객체를 생성하고 반환합니다. 이렇게 생성된 엔티티 객체는 JPA를 통해 데이터베이스에 저장될 수 있습니다.

DTO사용안한 코드는 이렇다
Controller

package com.BlogExample;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@RequiredArgsConstructor
@Controller
public class BlogApiController {
    private final BlogService blogService;

    @PostMapping("/api/articles")
    public ResponseEntity<Article> add(@RequestBody Article request) { // DTO 대신 엔티티를 직접 사용
        Article savedArticle = blogService.save(request);
        return ResponseEntity.status(HttpStatus.CREATED)
                .body(savedArticle);
    }
}

Service

package com.BlogExample;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class BlogService {
    private final BlogRepository blogRepository;

    public Article save(Article article) { // DTO 대신 엔티티를 직접 사용
        return blogRepository.save(article);
    }
}

또 궁금했던건 controller는 json으로 응답을 받을텐데 이거를 어떻게 데이터베이스에 저장하는지 그 매커니즘이 궁금했다.
또 간단하게 설명하면 이렇다.

Jackson 라이브러리는 기본적으로 JSON 데이터의 필드 이름과 객체의 필드 이름을 일치시켜 값을 저장합니다.


{
  "title":"첫글",
  "content":"첫글은 역시 똥글"
}

이 JSON 데이터를 Article 객체로 변환하면, Jackson 라이브러리는 JSON 데이터의 "title" 필드 값을 Article 객체의 title 필드에 저장하고, "content" 필드 값을 content 필드에 저장합니다.

ResponseEntity<Article>

사용하는 이유는 HTTP 응답을 더욱 세밀하게 제어하고, RESTful API 디자인 원칙을 준수하기 위해서입니다.ResponseEntity의 장점
HTTP 상태 코드 제어: ResponseEntity를 사용하면 HTTP 상태 코드를 명시적으로 지정할 수 있습니다. 예를 들어, ResponseEntity.status(HttpStatus.CREATED)는 201 Created 상태 코드를 응답과 함께 전송합니다. 이를 통해 클라이언트에게 요청의 성공 여부, 생성된 리소스의 위치 등을 정확하게 알릴 수 있습니다.
응답 헤더 설정: ResponseEntity를 사용하면 응답 헤더를 자유롭게 설정할 수 있습니다. 예를 들어, Location 헤더를 사용하여 새로 생성된 리소스의 URI를 클라이언트에게 알려줄 수 있습니다.
응답 본문 설정: ResponseEntity를 사용하면 응답 본문에 Article 객체와 같은 자바 객체를 담아서 전송할 수 있습니다. Jackson 라이브러리를 사용하여 자바 객체를 JSON 형식으로 자동 변환하여 클라이언트에게 전달합니다.
RESTful API 디자인: ResponseEntity를 사용하면 RESTful API 디자인 원칙을 준수하는 데 도움이 됩니다. RESTful API는 HTTP 상태 코드, 헤더, 본문을 사용하여 리소스의 상태와 관련된 정보를 명확하게 전달해야 합니다.
ResponseEntity를 사용하지 않을 경우
ResponseEntity를 사용하지 않고 Article 객체만 반환하면, Spring은 기본적으로 200 OK 상태 코드와 함께 응답을 전송합니다. 이는 단순한 API에서는 문제가 되지 않지만, 복잡한 API에서는 클라이언트에게 충분한 정보를 제공하지 못할 수 있습니다.
결론
ResponseEntity를 사용하면 HTTP 응답을 세밀하게 제어하고, RESTful API 디자인 원칙을 준수하여 클라이언트에게 더욱 명확하고 유용한 정보를 제공할 수 있습니다. 따라서, RESTful API를 개발할 때는 ResponseEntity를 사용하는 것이 권장됩니다.

Article로 반환받아도 되긴 한다는거다 ㅋㅎ

Article로 반환받으면 이렇게 된다고 한다


public Article addArticle(@RequestBody AddArticleRequest request) {

    // AddArticleRequest를 Article 엔티티로 변환합니다.
    Article article = Article.builder()
            .title(request.getTitle())
            .content(request.getContent())
            // 필요한 다른 필드 설정
            .build();

    // blogService를 사용하여 Article을 저장합니다.
    return blogService.save(article);
}

모르는게 뭔지 알아도 다시 짜기는 무섭다.. ㄷㄷㄷ

p.s)추가로 더 알아봐야할것은 제네릭과 리스트에 대해서 자바책으로 조금더 공부해야겠다

profile
맨큐의 개발일지

0개의 댓글

관련 채용 정보