잘하고싶은사람
66
2020-05-22 16:30:32 작성 2020-05-22 16:41:35 수정됨
3
202

스프링부트 CRUD 질문입니다!


안녕하세요 !! 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 책으로 독학하고 있습니다.

하지만 정말 막히는 부분이 많고 구글링을 해도 잘 모르겠어서 이렇게 질문을 남깁니다...



1. DB와 매칭될 테이블  Posts 클래스

package com.tistory.suhyeokeeee.boot.domain.posts;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity // 테이블과 매칭될 클래스임을 뜻함
public class Posts {

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

    @Column(length = 500, nullable =  false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

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

DB와 매핑되는 Posts 클래스는 이해가 됐습니다.




2. DTO 클래스

package com.tistory.suhyeokeeee.boot.web.dto;

import com.tistory.suhyeokeeee.boot.domain.posts.Posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
    private String title;
    private String content;
    private String author;
    
    @Builder
    public PostsSaveRequestDto(String title, String content,String author){
        this.title= title;
        this.content= content;
        this.author = author;
    }

    public Posts toEntity(){
        return Posts.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();
    }
}

실제 DB영역과 뷰에 보여질 영역이 다르게 구분 돼야 한 다는 것으로 인해 DTO를 추가로 만든 것은 이해 했습니다.

이 2번 사진에선 @Builder 애노테이션이 붙어있는 것과

public Posts toEntity() 이 부분이 이해가 잘 안되는데요

구글링을 통해 toEntity()가 필드값을 채워 넣는다는 걸 알게 됐는데

return 은 Posts를 하는 꼴 인데

Posts를 return 하면 어떻게 Dto에 값이 채워지나요..?



@Builder 애노테이션 아래에 있는 것부터

public Posts toEntity() 메소드 까지

어떤 역할을 하는 것인지 설명해주시면 정말 감사하겠습니다...


3. 서비스 클래스


package com.tistory.suhyeokeeee.boot.service.posts;

import com.tistory.suhyeokeeee.boot.domain.posts.Posts;
import com.tistory.suhyeokeeee.boot.domain.posts.PostsRepository;
import com.tistory.suhyeokeeee.boot.web.dto.PostsResponseDto;
import com.tistory.suhyeokeeee.boot.web.dto.PostsSaveRequestDto;
import com.tistory.suhyeokeeee.boot.web.dto.PostsUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@RequiredArgsConstructor
@Service
public class PostsService {

    private final PostsRepository postsRepository;

    @Transactional
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntity()).getId();
    }

}

그리고 서비스 단에 있는 메소드에서

return postRepository.save(requestDto.toEntity()).getId);

이 부분도 잘 모르겠습니다.

어떤 부분이 이해가 잘 안되냐면 requestDto의 toEntity 메소드를 호출하는건 알겠는데

따로 상속과 같은 처리를 해주지 않았는데 getId() 를 어떻게 사용하는지가 궁금합니다.

(getId 는 Posts클래스에 있습니다)

그리고 return type이 Long인데 postRepository.save()를 하면

데이터의 로우수를 리턴한다 라고 인터넷에서 검색해본 결과 알게 됐는데

실제로 return 되는 값이 없이 그냥 DB에 바뀌는지 궁금합니다.


적고보니 질문이 참 많네요... 죄송합니다

하지만 혼자 공부를 하니 주위에 도움을 청 할때가 없어 지푸라기 잡는 심정으로 올려봅니다.

읽어주셔서 감사합니다 !! 

0
0
  • 답변 3

  • 100m8cho
    461
    2020-05-22 17:13:49


    - Posts를 return 하면 어떻게 Dto에 값이 채워지나요..?


    DTO를 엔티티로 바꿔주는 메소드를 toEntity()를 만들어서 사용하신것 같습니다.

    DTO 자신을 entity 로 바꿀때 toEntity() 를 사용하여 Posts에 있는 builder 를 이용해서 Posts를 반환하는것 같습니다. 


    lombok의 빌더는 빌더를 만들지 않아도  생성자 위에 빌더 어노테이션을 이용해서 좀더 편하게 빌더를 만들어줍니다.

    롬복의 빌더를 사용하지 않고 빌더 패턴을 직접 코딩하려면 조금더 많은 코딩이 들어갈꺼에요 static Class Builder도 만들어야하고 build() 부분도 만들어야하구요

    그걸 조금 간단하게 해준다고 보시면 될 것 같네요


    - return postRepository.save(requestDto.toEntity()).getId); 요 부분은


    requestDto.toEntity() -> 요 부분에서 dto를 엔티티를 반환하는 메소드를 만들었으니 이제

    실제로 저장하는  repo.save 에  Posts entity 를 넘겨서 저장한것 입니다.  save() 에는 entity 를 넣어줘야 하니까요 


    구현한 postsRepository 는  jpaRepository extends 하신것 같은데요

    jpaRepository 는 paginAndSortingRepository ->  crudRepository 상속받게 되는 구조인데요 

    이떼 CrudRpository에 있는  <S extends T> S save(S entity); 를 이용해서 이제 엔티티를 저장하는데요 


    여기서 해당 함수 save 는  저장한 엔티티를 리턴하게 되어있습니다.

    그래서 posts 엔티티를 저장하고 저장한 엔티티를 반환받아

    해당 엔티티의 get 메소드를 사용하여 .getId 메소드를 사용하실수 있던 것 같아요 


    조금이라도 도움이 되셨으면 하네요

    0
  • 잘하고싶은사람
    66
    2020-05-22 18:53:27 작성 2020-05-22 18:55:31 수정됨

    친절한 답변 정말 감사합니다 ㅠㅠㅠㅠ

    그런데 저도 코드 뜯어보다가

    <T> 이렇게 돼 있는 것도 있고 <S> 이렇게 돼 있는 것도 있는데

    S랑 T가 뭘 뜻하는 건가요??


    그리고 제가 콘솔단위에서 알고리즘으로만 return 같은 걸 써봐서

    public int get_A(int a){

    a = 3;

    return a;

    }

    이런 메소드가 있을 때

    int b = get_A(b);

    이런 식으로 해야 b라는 필드에 3이라는 값이 들어가는걸 알고 있는데

    toEntity() 메소드 에서 

    dto객체 = return posts.build(~~~~~)

    를 하지 않아도 dto 객체에 저 값이 어떻게 들어가는 것 인가요..?


    또, toEntity() 메소드 명은 정해진 것이 아니라 바꿀수 있는데 대부분 저렇게 쓰는거 맞나요!?


    마지막으로 Posts에 있는 builder를 이용해 Posts를 반환한다 하셨는데

    Dto 의 빌더는 언제 쓰이나요?

    0
  • 잘하고싶은사람
    66
    2020-05-22 18:59:28


    requestDto.toEntity() -> 요 부분에서 dto를 엔티티를 반환하는 메소드를 만들었으니 이제

    실제로 저장하는  repo.save 에  Posts entity 를 넘겨서 저장한것 입니다.  save() 에는 entity 를 넣어줘야 하니까요 


    라고 하신 부분에서 Dto에 entity 값을 넣었지만

    형태는 Dto가 아닌가요...?

    getId 는 entity에 있는게 아닌가요..?


    질문 많아서 죄송합니다 ㅠㅠ... 


    시간 널널 하실 때 답변 주시면 감사하겠습니다 !!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.