묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
혹시 점보트론 적용 안되시는분들은
위에 많은분들이 말씀하셨듯이 현재 부트스트랩 최신버전은 5이기 때문에 점보트론이 적용되지 않는 문제가 있었는데 저처럼 정 신경쓰이시는 분들은 이걸로 쓰시면 될 것 같습니다 <!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"><!-- jQuery library --><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><!-- Popper JS --><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script><!-- Latest compiled JavaScript --><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> header.html의 bootstrap CSS 주석 부분에 붙이시면 됩니다 뒷부분을 아직 안들어서 그런데 CSS만 필요하신거면 4가지중 맨 위에 부분만 이용하셔도 되지 않을까 싶습니다
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
detach 후에 merge 에 관한 질문입니다
안녕하세요! 언제나 좋은 강의 감사드립니다. 강의를 듣고 여러가지 테스트를 진행하던 중 궁금증이 생겨 질문남길게요. 테스트를 진행했던 코드들은 다음과 같습니다. 1. 엔티티를 detach 한 상태에서 커밋시 DB에 쿼리가 날리가지 않는다. (영속성 컨택스트가 비어있음으로) @Test @Rollback(value = false) void detachTest(){ Person person = new Person(); person.setId(1l); person.setName("test1"); em.persist(person); em.detach(person); } -> 예상대로 동작하였습니다. 2. clear() 를 통해 영속성 컨택스트를 비운 후 merge() 를 통해 다시 영속화하면 커밋시 반영이 될 것. @Test @Rollback(value = false) void detachTest(){ Person person = new Person(); person.setId(1l); person.setName("test1"); em.persist(person); em.clear(); em.merge(person); } -> 예상대로 동작하였습니다. 3. detach 를 통해 영속성컨택스트에서 엔티티를 준영속 상태로 변경한 후 merge() 하여 다시 영속화 하면 커밋시 반영이 될 것 @Test @Rollback(value = false) void detachTest(){ Person person = new Person(); person.setId(1l); person.setName("test1"); em.persist(person); em.detach(person); em.merge(person); } -> 제 생각과 달리 possible non-threadsafe access to session 에러가 떨어졌는데 그 이유를 곰곰히 생각해봤지만 가늠이 잘 가지 않아 질문드립니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 매핑을 무조건 사용해야하나요?
개념이 헷갈려서 질문 드립니다. 1. Team의 List members를 사용하지 않고 Member에 있는 외래키를 이용해 팀의 멤버를 select하는 방법을 사용하면 안되나요? 2. 지금은 1:N 이지만 멤버도 여러 Team을 가질수 있는 N:N 을 한다고 가정하면 그 경우 1:N으로 나누어야해서 MemberTeam 같은 양 테이블의 기본키를 복합키로 가지고 있는 테이블이 필요하다고 알고 있습니다. 양방향 객체 관계를 가지면 위 테이블이 필요가 없어보이는데 중간 테이블을 만들고 select를 하는 것은 안되나요? 제가 이해를 잘못해서 그런지 굉장히 헷갈리네요
-
미해결실전! 스프링 데이터 JPA
baseEntity와 softDelete 질문
우선 관련 다른 댓글들은 읽고왔는데 더 궁금한 점이 있어 질문드립니다. Q1. baseEntity에서 abstract class를 사용하지 않고 실제 class를 사용하신 이유 softDelete 사용시 springdatajpa 레퍼런스 닥스에서는 엔티티에 delete flag를 만들어주고, @sql로 delete 실행을 delete flag를 true로 만들어주는 방식을 예제로 두고 있습니다. 그러면 baseEntity에서 - 필드 delete flag 선언 -> 전역 엔티티에 적용 - @sql 로 delete 실행 변경 -> 전역정용 - @where절 delete=false -> 전역 적용 이렇게 할 경우 장점으로는 cascade 옵션으로 delete// orphanRemoval에도 자동으로 delete 쿼리가 업데이트 쿼리로 변경되어 삭제 플레그의 연관관계를 보다 쉽게 처리할 수 있는거로 생각됩니다. 또한 필터? 옵션으로서 실제 플레그로 삭제된 엔티티도 조회 가능하도록 제공하는걸 확인했습니다. 관련 다른 댓글에서 답변해주신것을 보면 영한님은 전역 엔티티가 아닌 엔티티별로 메서드를 정의해주고 연관관계가 있을경우 직접 연관관계 메서드에서 해당 메서드를 사용하시는 것으로 추측됩니다. Q2. 그렇게 사용하시는 걸 선호하시는 이유를 알 수 있을까요? 개인적으로 전역으로 관리하는게 좋겠다 싶었던 이유는 사용자에 의해 기록된 모든 데이터가 기업의 입장에서는 엄청나게 큰 자산이고, 이것을 통해 추천 상품 알고리즘을 위한 데이터로 활용할수도 있고 (주문기록, 회원의 나이 등 정보, 관심상품 등등), 어떠한 비즈니스 정책들을 정하는데 큰 도움이 될거라 싶어 실무에서는 플래그로 삭제 하지 않을까? 해서 전역으로 관리 하는게 좋겠다 싶었습니다. 근데 전역으로 저렇게 처리할 경우, 고객 정보같은 민감한 데이터는 실제로 삭제를 해줘야 할것 같은데 (회원 탈퇴시 같은 경우) 회원과 연관관계가 있는 엔티티들이 엄청나게 엮어 있을때 이런 경우는 어떻게 처리해야 좋을지 감이 잡히지 않습니다. 그래서 추가 질문으로는 Q4. 실무에서 softDelete를 어떤 엔티티에 적용하는지 Q5. 회원은 민감한 정보라 실제 삭제를 할때 관련된 연관관계가 있는 엔티티는 어떻게 처리하는게 좋을지 예를들면 member에 null값으로 그냥 냅두는지 이런 것들이 궁금합니다. 답변주시면 정말정말 감사드리겠습니다. 쿼리dsl 강의 듣기전에 datajpa로 이것저것 토이프로젝트를 해보면서 고민해보는데 생각보다 적용함에 있어 고려할것들이 넘쳐나 질문을 많이 하게되네요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
h2 데이터베이스
안녕하세요 강사님! h2 console에서 test connection을 했는데 whitelabel error page가 뜹니다.. datasource를 추가해서 시도해보고 여러 가지를 시도해봤는 데도 해결이 안 되네요ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
this.set~(~); vs set~(~); 차이
제가 자바에 대해 완전히 이해하고 있지 않은지 this.를 붙이고 getter/setter를 쓰는 거와 그냥 바로 getter/setter를 쓰는 것, 이 두 개가 다른 가 싶더라구요 OrderItem에서 getItem().~~; 을 보면 그냥 getter를 썼는데 Order에서 this.setOrderStatus(~);를 보면 this를 붙인 후 seter를 써서 제가 아는 걸 쥐어짜내보면 둘 다 똑같을 것 같은 느낌이 들긴 하는데;; 뭐가 다른 건가요 ? class OrderItem{ .. public void cancel() { getItem().addStockQuantity(count);} .. } class Order { .. public void cancel() { if (delivery.getDeliveryStatus() != DeliveryStatus.READY) { throw new IllegalStateException("이미 배송되었거나 배송중입니다."); } this.setOrderStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItemList) { orderItem.cancel(); }} .. } //아 또 갑자기 궁금한 게 생겼는데.. public class Order() { .. private OrderStatus orderStatus; .. public void cancel() { if (delivery.getDeliveryStatus() != DeliveryStatus.READY) { throw new IllegalStateException("이미 배송되었거나 배송중입니다."); } this.setOrderStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItemList) { orderItem.cancel(); }} .. } 에서 this.setOrderStatus(OrderStatus.CANCEL); 이 아니라 orderStatus = OrderStatus.CANCEL; 로 해도 프록시 조회의 문제를 제외하면 상관 없을까요 ? 혹시 모르니 set을 통한 방법을 만들어 두는 게 안전한 방법인가요 ? 뭔가 이 질문은 부끄러운 질문 같은데.. 올려봅니다..
-
미해결실전! 스프링 데이터 JPA
유니크 데이터 조회시 list // optional
유니크 데이터 조회시 반환타입을 list // optional 이렇게 두개로 받을 수 있는데, 개인적으로는 optional의 경우 orElseThrow를 통해 예외를 던지거나 원하는 예외로 던질 수 있어 이쪽이 선호되는데 1. 반환타입은 사용하는 사람 취향일까요 아니면 좋은 방식이 있을까요? 2. 기본적으로 스프링이 던지는 예외를 사용하는게 좋을까요 커스텀으로 예외를 만들어 주는게 좋을까요? 답변주시면 감사드리겠습니다.
-
미해결실전! 스프링 데이터 JPA
안녕하세요! Exception 관련 질문드립니다!
안녕하세요! 6월 방학부터 개학한 오늘까지 김영한님의 모든 강의를 들으며 많은 깨달음을 얻고 실력을 키웠습니다. 먼저, 정말 좋은 강의를 해주셔서 감사하다는 말씀을 드립니다! 제가 질문드리고 싶은건 NoResultException입니다! JpaReopsitory<T,ID>를 상속받는 레포지토리는 Member findByUsername(String username) 를 하고 memberRepository.findByUsername("DB에 없는 username") 을 할시에 null이 들어가면서 exception이 터지지 않는데 MemberRepository.java public Member findByUsernmae(String username) { return em.createQuery("select m from Member m where m.username=:username", Member.class) .setParameter("username", username) .getSingleResult();} memberJpaRepository.findByUsername("DB에 없는 값")을 할시에는 Exception이 터집니다. 먼저, Repository 내에서 NoResultException이 터지고 Repository에서 나갔을때는 EmptyResultDataAccessException이 터지는거에 궁금했었는데 이건 방금 강의에서 말씀해주셔서 아! 하고 알았습니다. 하지만, JpaRepository를 상속받은 레포지토리는 같은 쿼리를 날리지만 어떤 원리로 exception이 터지지 않고 null이 들어가는지 궁금합니다! 혹시, JpaRepository인터페이스를 구현한 클래스에서 Exception을 잡은다음에 null로 뿌려주는것일까요? 감사합니다!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
안녕하세요. JPA 관련 질문이 있습니다.
안녕하세요. 강사님 강의 매우 잘 듣고 있습니다 ! 다름이 아니라 JPA 질문이 있는데 너무 뒤에서 질문을 남기는게 아닌가 싶습니다. 공부할 때 기본생성자가 필요하다고 배웠는데 다른 도메인 같은 경우는 AllArgsConstructor 랑 NoArgsConstructor 를 사용했는데, 이번 경우는 따로 안하셨더라구요.기본 생성자가 없을 경우 NoArgs 로 해서 PROTECTED 로 하거나 기본 생성자를 만드는 걸로 아는데. 따로 작성 안하신 이유가 있을까요..? 아니면 제가 잘못알고 있는건지 궁금합니다. 감사합니다.
-
미해결스프링 데이터 JPA
복잡한 통계쿼리도 JPA로 가능한가요?
기선님 쉽게 설명해주시는 강의를 보며 참 많은 도움이 되고있습니다. 실제 제가 만들고 있는 모델관 다르지만 질문하기 위해 예시를든다면 , 쇼핑몰을 예로 어떤 상품들이 있고 그것에 대한 판매가 이뤄진다고 가정할때 엔티티는 상품, 주문, 결제등이 있을수 있겠죠. 이때 '상품들의 월별 판매량'을 통계 내야 한다고 치고 --------------------------------------- 상품명 1월 2월 3월 4월 5월 ... 합 -------------------------------------- 상품A 20 15 4 7 8 104 상품B 1 1 10 2 1 25 ---------------------------------------- 이런식의 통계 쿼리를 짜야 할경우 JPA로 가능한지? QueryDSL 등을 써서라도 가능한지? 감이 안잡힙니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 설계 관련 질문
프론트 엔드에서 전체 category를 조회해서, 화면에 카테고리를 선택할수 있도록 출력해주는 화면이 있고 유저가 게시글을 등록한다고 한다면 --- 1. 아래와 같이 Category 테이블에 모든 카테고리를 저장해 (init), 2. 이 리스트를 전달해주고, (미리 카테고리들은 정해져 있다고 할때, 추가도 할수 있겠지만) 3. user가 게시글을 등록할때 client가 입력한 category를 category table에서 찾아오고 4. 그 값을 기반으로 post와 postCategory에 저장해주는 방식이 되어야 하는거 같은데 (강의들중 어디에서 질문하는게 좋을지 약간 애매해서 여기에 글 올립니다.) ------ 이렇게 하는 방식이 맞을까요? 뭔가 동작 하게끔 할수 는 있는데 올바른 방법같지 않아서 영한님 다른강의들도 들어보면서 같이 몇일째 고민중인데 찜찜하고 명확하게 확신이 안섭니다. 카테고리 목록은 initService를 하나 만들어서 미리 저장해두었습니다. (강의에서 하신 initDb처럼) 답변주시면 감사드리겠습니다. 몇일째 해결이 안되요 ㅠㅠ post테이블의 CATEGORY_TAG는 삭제 예정입니다 public class Post { @Id @GeneratedValue @Column(name = "post_id") private Long id; private String title; @Lob private String desc; private int price; @Enumerated(EnumType.STRING) private Status status; @ManyToOne @JoinColumn(name = "account_id") private Account seller; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "post_category_id") private PostCategory postCategory; // old @Enumerated(EnumType.STRING) private CategoryTag categoryTag; /*@OneToOne @JoinColumn(name = "category_id") private Category category;*/ public Post(String title, Account seller){ this.title = title; this.seller = seller; status = Status.NEW; } // old public Post(String title, String desc, int price, CategoryTag categoryTag, Account seller){ this.title = title; this.desc = desc; this.price = price;// @Converter this.categoryTag = categoryTag; this.seller = seller; status = Status.NEW; seller.addPost(this); } public Post(String title, String desc, int price, Account seller){ this.title = title; this.desc = desc; this.price = price;// @Converter this.postCategory = postCategory; this.seller = seller; status = Status.NEW; seller.addPost(this); } //== 연관관계 메서드 ==/ public void setSeller(Account seller) { this.seller = seller; seller.addPost(this); } //== 바즈니스 로직 ==// // old public static Post post(String title, Account seller, CategoryTag categoryTag){ Post post = new Post(title, seller); post.setCategoryTag(categoryTag); return post; } public void setPostCategory(PostCategory postCategory){ this.postCategory = postCategory; postCategory.setPost(this); }} @Entity@Setter@Getterpublic class PostCategory { @Id @GeneratedValue @Column(name = "post_category_id") private Long id; @OneToOne(mappedBy = "postCategory") private Post post; @OneToOne @JoinColumn(name = "category_id") private Category category;} @Entity@Getter@Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Category { @Id @GeneratedValue @Column(name= "category_id") private Long id; @Enumerated(EnumType.STRING) @Column(unique = true) private CategoryTag categoryTag; public Category(CategoryTag categoryTag){ this.categoryTag = categoryTag; }} @PostMapping("/new2")public PostResponseDto postV2(@RequestBody PostRequestDto postRequestDto, @ApiIgnore HttpSession session){ Account account = getSessionCheckedAccount(session); Post post = new Post(postRequestDto.getTitle(), postRequestDto.getDesc(), postRequestDto.getPrice(), account); Category category = categoryJpaRepository.findByCategoryTag(postRequestDto.getCategoryTag()); PostCategory postCategory = new PostCategory(); postCategory.setCategory(category); post.setPostCategory(postCategory); Long postId = postService.post(post); return new PostResponseDto(postId);}
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입과 엔티티 차이 고민
강의 39분10초에 "엔티티는 값을 마음껏 수정할 수 있다" 는 말씀에 이해를 못하고 있습니다. 아래에는 제가 정리한 값타입의 특징과, 한 예시에 대해서 값타입/엔티티를 적용했을 때 상황을 고려해봤습니다. 마지막에 내린 결론이 올바른지 궁금합니다. [값 타입의 특징] - 서로 다른 두 엔티티 Member A, B는 한 값타입객체를 공유하지 말 것 - 엔티티의 필드로서 값타입(Address)에 대하여 값타입의 필드(city)를 수정하고 싶을 땐, new Address(..)로 새로운 객체를 사용할 것 - 혹여나 공유하는 실수를 했을 때 컴파일러로 찾아내기 어렵다. 따라서 대응책으로 setter메소드 없는 불변객체로 설계한다. (예시) 서로 다른 회원 A, B가 한 가족이라 같은 주소에 살고있다. 그런데 A가 독립해서 주소를 옮겼다. 1.값타입 경우) - 두 회원이 동일한 Address 값타입의 인스턴스를 공유하지 않고 각 회원별로 Address인스턴스가 달라야함. - 따라서, memberA.getAddress( ).setCity('xxx') 로 직접 수정해도 B의 address인스턴스에 부작용 없지만, 코딩을 할 때 실수로 동일 Address객체를 공유하도록 코드를 작성 할 수 있기에, 이를 방지하기 위해 값타입에 setter메소드정 의 안함 - 즉, setCity( )메소드를 못 쓰니까 도시속성을 바꿀 수가 없음. 따라서 memberA.setAddres(new Address( ~~) )로 새 객체를 만들어 교체해줌 2.엔티티 경우) - 엔티티의 본래 특성상 parent엔티티 A, B가 같은 child엔티티C를 공유가능함(예. 동아리A, B는 같은 학생C를 회원으로 받을 수 있음) - 그러나 위 (예시)의 비즈니스 특성상 엔티티도 공유하면 안됨(한 명이 이사한 주소로 다른 한 명도 주소가 변경되는 문제) - 엔티티 또한 아래 코드와 같이 공유하게 되면 addEntity.setCity('성남', '분당구') 로 A, B모두 주소가 변경됨 AddressEntity addrEntity = new AddressEntity('서울', '강남구'); memberA.setAddressEntity( addrEntity ); memberB.setAddressEntity( addrEntity ); memberA.getAddress().setCity('성남', '분당구'); - 따라서, 엔티티의 경우도 setCity와 같은 setter메소드가 있으나 회원A의 address를 얻어와 개발자 마음껏 setter수정을 할 수 없을것 같다 !? 강의의 39분10초 설명 "엔티티는 값을 마음껏 수정할 수 있다"에 반하는 결론이라 어디가 틀렸는지 짚어주셨으면 좋겠습니다. 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Error: Unable to access jarfile .port=9004
Error: Unable to access jarfile .port=9004 해당 오류에 대해 원인을 모르겠습니다
-
미해결실전! 스프링 데이터 JPA
결과 리스트의 size() vs count 쿼리
count 쿼리가 나가는 이유가 궁금합니다. Select 결과로 받아온 리스트의 size()를 실행시키는 게 count 쿼리를 다시 날리는 것보다 비용이 적을 것 같은데, count 쿼리가 다시 나가는 이유가 궁금합니다 :) 강의는 늘 즐겁게 듣고있습니다 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
RestApi에 대하여
안녕하세요! 강사님 항상 좋은강의 정말 감사드립니다. 평소에 Api 특히 Rest APi에 대해서 너무 광범위한 사용과 문맥에 정말 개념이 잡기가 어려웠는데, 이번 강의를 통해서 많이 개념이 잡혀나가는것 같아 뿌듯하고 감사합니다. 공부를 하던중에 궁금한 것이 있는데 1. Rest api라고 하는건 mvc패턴에서의 api(템플릿 엔진을 주로 사용하여 리턴해주는 컨트롤러)는 Rest api의 범주에 들어오지 않는건가요? 2. 그리고 클래스 Annotation중에 @RestController가 붙으면 http body 부분에 json 형식으로 data가 디폴트로 나가는 건지 궁금합니다. 데이터를 text/plain이나, xml같은 형식으로 body에 response하려면 어떻게 해야할까? 라는 궁금증이 있습니다. 답변 부탁드립니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Paging, batchSize관련 질문
team1에 멤버 2명, team2에 멤버 5명 이런식으로 있다고 할때 배치 사이즈 설정의 경우 2로 설정을 하면 팀의 단위를 2개 기준으로 나눠서 배치로 조회하는 것은 알겠습니다. 그러면 위의 경우 7개의 결과가 출력되는 건데, ---- 만약 한번에 총(팀단위 x) 5개씩 조회를 하고 싶다면 이 건의 경우 배치사이즈 설정으로는 페이징 할 수 없는 것 같은데, (팀 a 멤버1, 2 / 팀 b 멤버 1,2,3) (팀b 멤버 4,5)이런식으로 이 경우에는 어쩔수 없이 멤버를 기준으로 조회해서 (멤버 + 팀) 5개씩 Maxsize 설정을통해 5개씩 출력하는 수밖에 없는 건가요? (+ team이름 기준으로 순서를 매겨?) ---- 만약에 테이블에서 결과를 k개씩 출력한다고 할때,어떤 경우에는 N:1(member -> team join)에서 페이징이 아닌 1:N 관계에서 조회가 필요(team -> member join)하고 k개씩 페이징하고 싶다고 하면 배치로는 해결하지 못하는 것 같은데 다른 방법이 있을까요? --- 여기서 예시로 든 case에는 사실, 멤버를 기준으로 팀을 조인하고 페이징하면 해결이 되지만, 어떤 경우에는 1:N관계에서 출력이 필요한 경우도 있지 않을까해서 여쭤봅니다. 그런경우는 거의 없을까요? 답변주시면 감사드리겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Member엔티티와 Order엔티티의 일대다 연관관계 불필요성
https://www.inflearn.com/questions/66107 글에 답변주신 내용중에 질문있습니다. "오히려 주문, 배송 등등 객체 각각이 살아있어서 필요한 곳을 참조하는 식으로 설계하는게 더 좋은 설계 방법" 말씀하신 내용중에 '필요한 곳을 참조하는 식' 이 부분 설명이 이해가가지 않습니다. 혹시, Member-Order 간의 연관관계에서 Member엔티티 클래스안에 @OneToMany List<Order>일대다 연관관계를 c끊어내므로서 Member로 Order엔티티객체에 접근할 수 없게만들고 직접 em.find 나 em.createQuery 로 Order엔티티객체를 얻어내라는 말씀이신가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 생성이 안됩니다 ㅠㅠ
maven으로 시작했습니다. 제가 진행하는 프로젝트가 maven이라 그렇게 배워보려고요.. 그런데 테이블 생성이 잘 안됩니다 ㅠㅠ member까지는 어떻게 생성을 했는데 그 이후 테이블 생성이 console에도 나오지 않고, h2에도 뜨지않아요. 또 member에 insert도 되지않습니다. 테이블 안에 내용이 들어가질 않는데 어떻게 해야할까요 ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티 기본 생성자를 protected로 했을 때 테스트 질문
선생님 안녕하세요, 처음이라 모든 것이 낯설지만 양질의 강의 덕에 순조롭게 학습을 진행하고 있습니다. 감사합니다 ^^ 다름이 아니라, 앞 강의 (엔티티 설계 주의점) 및 강의자료(p29)에서 Entity나 Embedded type 생성자를 protected로 하는 것이 더욱 안전하다고 말씀해주셨습니다. 그래서 Entity의 생성자도 protected로 설정하고 진행해보았습니다. 그런데 테스트를 하려고 보니 테스트용 Entity 객체를 생성할 수 없는 문제가 생겨서 일단 default 생성자를 public으로 하고 계속하였습니다. 혹시 protected 생성자를 사용하면 테스트하는 방법이 있는지요, 아니면 이러한 문제로 인해 Entity는 public 생성자를 사용해야 하는지요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Validation (JSR-303 validation with Hibernate validator) 모듈 추가
제목 그대로 스프링 부트 스타터 설정에서 저 모듈을 추가하라는 말씀이 어떻게 해야하는 건지 잘 모르겠네요..코드를 추가하는건가요? 혹시 스프링부트 스타터에서 추가하는건가요?