Giter VIP home page Giter VIP logo

spring-jpa-best-practices's Introduction

Build Status Coverage Status codecov Hits

Spring-Jpa Best Practices

스프링으로 개발을하면서 제가 느낀 점들에 대해서 간단하게 정리했습니다. 아직 부족한 게 많아 Best Practices라도 당당하게 말하긴 어렵지만, 저와 같은 고민을 하시는 분들에게 조금이라도 도움이 되고 싶어 이렇게 정리했습니다. 지속해서 해당 프로젝트를 이어 나아갈 예정이라 깃허브 Start, Watching 버튼을 누르시면 구독 신청받으실 수 있습니다. 저의 경험이 여러분에게 조금이라도 도움이 되기를 기원합니다.

목차

  1. step-01 : Account 생성, 조회, 수정 API를 간단하게 만드는 예제
  2. step-02 : 효과적인 validate, 예외 처리 (1)
  3. step-03 : 효과적인 validate, 예외 처리 (2)
  4. step-04 : Embedded를 이용한 Password 처리
  5. step-05: OneToMany 관계 설정 팁
  6. step-06: Setter 사용하지 않기
  7. step-07: Embedded를 적극 활용
  8. step-08: OneToOne 관계 설정 팁
  9. step-09: OneToMany 관계 설정 팁(2)
  10. step-10: Properties 설정값 가져오기
  11. step-11: Properties environment 설정하기
  12. step-12: 페이징 API 만들기
  13. step-13: Query Dsl이용한 페이징 API 만들기
  14. step-14: JUnit 5적용하기
  15. step-15: Querydsl를 이용해서 Repository 확장하기(1)
  16. step-16: Querydsl를 이용해서 Repository 확장하기(2)

step-XX Branch 정보를 의미합니다. 보고 싶은 목차의 Branch로 checkout을 해주세요

질문

  • Github Issue를 통해서 이슈를 등록해주시면 제가 아는 부분에 대해서는 최대한 답변드리겠습니다.

개발환경

  • Spring boot 1.5.8.RELEASE
  • Java 8
  • JPA & H2
  • lombok
  • maven

프로젝트 실행환경

실행

$ mvn spring-boot:run

API Swagger

해당 API는 Swagger http://localhost:8080/swagger-ui.html으로 테스트해 볼 수 있습니다.

spring-jpa-best-practices's People

Contributors

cheese10yun avatar haservi avatar jaeyeonling avatar jjangga0214 avatar ofnullable avatar prde9306 avatar slaysd avatar v0o0v avatar viviennes7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-jpa-best-practices's Issues

안녕하세요. JPA 공부하다가 궁금한 사항이 있어서 글 남깁니다.

유용한 자료 올려주셔서 감사합니다.

자료를 보면서 JPA 관련한 토이프로젝트를 해보고 있는데 몇가지 궁금증이 생겨 글을 남깁니다.

어느 아티클이 있고 해당 아티클에 댓글이 달리는 작은 서비스를 만들어보고 있습니다.
Article 과 Comment 라는 엔티티이고 둘의 관계는 일대다 관계로 설정되어 있습니다.

Article 의 기준에서 Comment 는 여러개가 달릴 수 있고, ( 1 : N )
Comment 의 기준에서 여러 개의 Comment 들은 하나의 Article 에 달릴 수 있다고 판단하여 ( N : 1 )
관계로 두었습니다.

첫번째 질문.

하나의 아티클에 댓글 작성 시 dto 작성에 관한 질문.

만약에 사용자가 특정 아티클에 대해서 댓글을 작성한다고 가정한다면, 저는 해당 Dto 를 Commenet 에 관한 Dto 로 작성하고 아래와 같이 표현하였습니다.

CommentOneRequestDto.class

@Getter
public class CommentOneRequestDto {

    private Long articleId;

    @NotBlank(message = "comment is not empty.")
    private String comment;

    public Comment toEntity() {
        return Comment.builder()
                .comment(this.comment)
                .build();
    }
}

하나의 댓글을 등록함에 있어서 해당 Dto 가 article 에 대한 Id 를 Dto 내부에 가지고 있는게 올바른 방법인지 헷갈려서 질문을 남깁니다. (해당 Dto 는 Comment 쪽의 Controller 에서 받는것으로 정의되어 있습니다. )

Comment 에 관한 컨트롤러는 아래와 같이 구성되어 있습니다.
CommentController.class

@PostMapping("/comment")
public ResponseEntity<CommentOneResponseDto> saveComment(@Valid @RequestBody CommentOneRequestDto dto,
                                                         BindingResult bindingResult) throws ValidationException {
  • 댓글이 특정한 아티클에 작성되려면 분명히 아티클에 대한 id 값을 알고 있어야 하는데, 이 아이디 값을 어떻게 서버로 전달하는게 좋을지에 대해 생각하다가 저는 위와 같이 생각하였습니다. id 값을 @PathVariable 로 받을까라는 생각을 하였지만, 댓글을 작성하는데 댓글 api 단에서 아티클 id를 받는게 좋지 않다고 판단해서 위와 같이 작성을 하였습니다.

두번째 질문.

댓글을 작성하였을 때 서비스 레이어에서 댓글을 등록하는 방법에 관한 질문

하나의 댓글을 작성하고 저장하는 로직이 댓글 서비스 레이어에서 있다고 한다면 레이어에 2 개의 레파지토리가 필요하더군요. ArticleRepository, CommentRepository 저는 이렇게 하는 것이 좋은지 혹은 CommentService 에서 ArticleService 에 대한 메소드를 호출하는 것이 나은지 궁금합니다.

CommentService.class :: 두 개의 레파지토리를 가지고 있는 경우

@Service
public class CommentService {
    
    @Autowired
    private ArticleRepository articleRepository;

    @Autowired
    private CommentRepository commentRepository;

    public CommentOneResponseDto addNewComment(CommentOneRequestDto dto) throws ArticleNotFoundException{

        Article article = articleRepository.findById(dto.getArticleId())
.orElseThrow(() -> new ArticleNotFoundException("아티클이 존재하지 않습니다."));

        Comment comment = dto.toEntity();
        comment.setArticle(article);

        article.addComment(comment);

        commentRepository.save(comment);

        return new CommentOneResponseDto(comment);
    }
}

CommentService.class :: 하나의 레파지토리를 가지고, ArticleService 의 메소드를 이용하는 경우

@Service
public class CommentService {

    @Autowired
    private ArticleInternalService articleInternalService;

    @Autowired
    private CommentRepository commentRepository;

    public CommentOneResponseDto addNewComment(CommentOneRequestDto dto){

        Article article = articleInternalService.findById(dto.getArticleId());

        Comment comment = dto.toEntity();
        comment.setArticle(article);

        article.addComment(comment);

        commentRepository.save(comment);

        return new CommentOneResponseDto(comment);
    }
}
  • 저는 댓글이 작성되는 서비스 레이어가 직접적으로 ArticleRepository 를 건드리는게 맞다고 판단하지 않아서 ArticleService 이외의 ArticleInternalService 를 두어서 서비스 레이어간의 데이터 송수신? 에 관한 목적으로 다른 서비스 레이어를 호출하는 형태로 두었습니다. 이 부분에 대해서 제대로된 기준을 판단하기 어려웠고 이렇게 질문을 남깁니다.

질문이 두 개지만 질문을 하기위한 설명을 제대로 하는게 좋을 것 같아서 좀 장황하게 작성이 되었습니다. 다시한번 좋은 자료 공유해주셔서 감사드리고 혹 시간되실 때, 답변주시면 감사하겠습니다.

step-1

  • 계정 업데이트 API
  • 회원가입 API
  • 특정회원 조회 API

안녕하세요 Dto 예제 사용과 관련하여 여쭤보고 싶은게 있습니다

안녕하세요
좋은 예제 올려주신점에 감사합니다.
예제를 보고 연습을 하던 중 궁금한 사항이 있어 질문을 드리고자합니다..(따로 질문 칸이 없어 이슈에 올리게 되었습니다.)
저는 스프링 부트 사용중입니다.
https://spring.io/guides/gs/handling-form-submission/
위 예제를 보셨을 때 다름이 아니고 웹에서 MVC컨트롤러로 값을 받아오는 중 form 처리에 있어 ModelAttribute로 받음에 있어 setter로 해당 파라미터들이 들어가게 되는 것 같습니다.
하지만 Dto 상에 Setter가 없기 때문에 해당 파라미터들이 정상적으로 set이 되지 않아 null로 표시되고 있습는 것 같습니다.
혹 이런 시점에 적절한 방법이 있을까요?

감사합니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.