묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Valid 유효성 체크 시 질문 있습니다!
강사님 안녕하세요! 상품 등록하는 부분에도 유효성 검사를 추가 해봤는데요. Neither BindingResult nor plain target object for bean name 오류가 나서 검색해보니 @ModelAttribute를 붙이면 된다고 해서 해결했습니다. 근데 회원등록 시에는 @ModelAttribute를 사용하지 않았어서 비교해봤더니, 모델객체에 담을 때 클래스명이랑 똑같이 설정하면 정상 동작하더라구요. 오류는 해결했는데 @ModelAttribute를 붙여야될 때도 있고 안 붙여도 될 때도 있고,,, 왜 이렇게 동작하는지 궁금합니다..ㅎㅎ 그리고 여기서 @ModelAttribute가 무슨 역할을 해주는지도 궁금합니다. model.addAttribute("form", new BookForm()); @Valid BookForm form => 오류남 model.addAttribute("form", new BookForm()); @ModelAttribute("form") @Valid BookForm form => 정상 동작 model.addAttribute("form", new BookForm()); @ModelAttribute @Valid BookForm form => 오류남 model.addAttribute("bookForm", new BookForm()); @Valid BookForm form => 정상 동작
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService의 order() 메서드 파라미터 관련 질문드립니다!
안녕하세요! 쉽고 재밌는 강의 만들어주셔서 감사합니다! OrderService 서비스의 public Long order() 메서드 관련해서 질문드리고자 합니다. 강의해주신 대로는 order() 함수에서는 여러 orderItem을 넣을 수 있는 것으로 설계가 되어 있습니다. 그래서 order 객체를 생성할 때 orderItem 여러 개를 파라미터로 받을 수 있도록 OrderItem... orderItems로 설정해주셨습니다. 그런데 public Long order() 함수에서는 파라미터가 하나의 itemId 및 count만을 받아서 order() 함수 내에서 order 객체를 생성할 때 하나의 orderItem만 추가 가능하다고 생각했습니다. 이 경우 아이템마다 외부에서 item마다 order() 함수를 호출하여 order객체의 필드인 orderItems에 orderItem을 추가하여야 하는 것인지 궁금합니다. 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Interface를 이용한 다형성 매핑을 실무에서는 어떻게 풀어나가나요?
안녕하세요, 선생님(?). 영한님의 온라인 팬인 스프링 주니어 백엔드 개발자입니다. 영한님의 교재와 ORM관련 강의를 듣고, 열심히 사내에서 적극적으로 도입하자고 강추한 결과 실무에 도입을 할 기회가 생겨서 적용하고 있습니다 ! (뿌듯) ----------- 인터페이스를 통한 다형성의 경우에는 JPA 스펙에서 지원하지 않는 것으로 알고있는데요, 강의에 나온 예제 도메인과 같이 (Item, Book ... 등등) 공통적으로 묶어줘야 할 데이터가 있는 경우에는 abstract class를 통한 부모-자식 상속관계로 표현하는 것이 맞다고 생각하나, 이는 자식 클래스가 부모 클래스에게 강하게 결합되기 때문에 다양한 타입의 객체가 수행해야 할 책임을 묶는 경우에는 '인터페이스를 통해서 다형성을 구현하는 것이 더 맞지 않나?'라고 생각해서 질문드리게 되었습니다. 그러면, 실무에서는 JPA를 사용해서 도메인 객체를 표현할 때 인터페이스는 사용하지 않는지 궁금합니다. 혹은 사용하려면 이러한 문제를 실무에서는 어떻게 풀어나가는지에 대해서도 궁금합니다. ----------- 항상 질 좋은 강의 들을 수 있게 해주셔서 감사합니다. - 영한님의 온라인 팬 주니어 개발자 -
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
EntityManager를 사용하는 Repository의 단위 테스트는 어떻게 수행하나요?
이번 강의에서는 Service 단위 테스트를 주로 수행하셨는데, Repository나 Domain 단위 등으로 쪼개서 테스트를 수행하는 게 보다 확실하다고 말씀해주셨습니다. 그 장점으로는 1) 테스트 속도가 빠르다. 2) 보다 정확하다. 를 말씀해주셨던 걸로 기억합니다. 강의 완강 후 학습 내용을 바탕으로 작은 실습을 해보고 있는데 이와 관련된 궁금증이 있어 질문드립니다. Repository에서 EntityManager @RequiredArgsConstructor으로 주입 받아 사용중입니다. 이 경우 Spring에서 EntityManager를 주입해주는 것이기 때문에 @SpringBootTest가 필수적인 걸까요? 만약 그렇다면 Repository와 Service단에서는 빠른 테스트를 수행하는 게 불가능하다고 생각하면 될까요? 혹은 다른 방법이 있다면 경험과 지식을 공유해주시면 감사하겠습니다. 좋은 하루 보내세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
recompile말고 새로고침으로는 안 되나요?
영한님 안녕하세요! 강의 정말 잘 듣고 있습니다. 궁금한게 Spring Framework에서는 제 기억에 별 다른 세팅 없이 새로고침하면 정적 소스들이 변경됐던 것 같은데, 스프링 부트에서는 새로고침이 아니라 꼭 recompile을 해줘야 변경사항이 반영되는건가요? 새로고침만으로 변경시킬 순 없나요? 일일이 recompile하기 번거로울 것 같아서요 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUnit5 사용하시는 분들은 이렇게...
JUnit5에서는 @SpringBootTest에 @RunWith(SpringRunner.class)가 포함되어있고, public을 명시해주지 않으셔도 됩니다. @Test(expected)는 4보다 귀찮아졌네요.. package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() throws Exception { //given Member member = new Member(); member.setName("1hoon"); //when Long joinId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(joinId)); } @Test void 중복_회원_예외() throws Exception { //given String name = "1hoon"; Member memberA = new Member(); memberA.setName(name); Member memberB = new Member(); memberB.setName(name); //when memberService.join(memberA); //then IllegalStateException thrown = assertThrows(IllegalStateException.class, () -> memberService.join(memberB)); assertEquals("이미 존재하는 회원입니다.", thrown.getMessage()); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
junit5로 테스트하시는분은 이렇게 하시면 됩니다
제가 실습중인 환경은 SpringBoot 2.3.1.RELEASE여서 error: cannot find symbol 위 오류가 발생했는데, 코드 수정해서 해결했습니다. 참고하시면 도움될것같습니다. package jpabook.jpashop.member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional // @Rollback(false) 테스트 종료 후 데이터를 롤배하지 않고 그대로 남겨두는 옵션 public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("1hoon"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then assertEquals(findMember.getId(), member.getId()); assertEquals(findMember.getUsername(), member.getUsername()); assertEquals(findMember, member); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
데이터를 유지 하려면
안녕하세요. 방금 막 완강을 마친 학생입니다. 우선 수업 정말 잘들었습니다. jpa와 함께, 지금까지 배웠던 것을 쭉 다시 복습하고, 2편으로 넘어갈 생각입니다. 이번 질문은 다름이 아니라, 지금 서버를 재시작하면 기존의 데이터가 삭제되고 데이터가 새로 쓰이잖습니까. 이게 application.yml의 ddl-auto:create 때문인지 그래서 테이블을 서버를 run할 때마다 새로 생성하기 때문인지, 아니라면 기존 데이터를 db에 유지하는 방법을 알고 싶습니다. 더 좋은 질문을 가져올 수 있도록 복습하겠습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
메서드를 만들어서 사용할때는
Item쪽에서 change() 메서드를 만들어야하나요 ? 만약 만들게된다면 service에서는 파라미터값으로 Id값을 안넘겨주고 findeOne만 실행하게 되는데 Item class에서는 값을 셋팅할때 book에대한 Author는 수정을 어떻게하나요?? Item에 존재하는 필드로 넘겨받은 값들은 수정할 수 있는데 Book에 있는 Author는 수정을 못하는데 어떻게 하면 되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
onetoone에서 lazy관련해서 질문드립니다~!
안녕하세요, 고퀄리티 강의 감사합니다 영한님. onetoone과 lazy에 관련해서 궁금한점이 있어 질문 남깁니다. ※ table구조 - member (1) - (1) phone (onetoone) - fk는 phone에 member_id로 존재하는 형태 - member에 phone_id소유 X 1. 위 테이블 구조일때 jpa입장에서 onetoone에서는 proxy객체를 생성할 수 없기때문에 lazy로 설정해도 쿼리가 나간다는 부분에대해 이해했습니다. 2. 그런데 모든 연관관계는 lazy로 설정해야된다고 말씀하셨는데 onetoone을 lazy로 설정해버리면 복수건을 find했을때 바로 N+1이 발생하는것 같습니다. onetoone일 경우 lazy로 어떻게 동작하게 할 수 있는지 궁금합니다~! 불가능하다면 이런 경우 어떻게 해결할 수 있는지도 말씀해주시면 감사하겠습니다~!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드
안녕하세요, 영한님 강의에선 위처럼 하셨는데 궁금한게 생겨 질문드립니다. 1. 위 대신에 아래처럼 Member 엔티티에 연관관계 메서드를 해도 되나요? public void addOrders(Order order){ this.orders.add(order); order.setMember(this);} 2. 연관관계의 주인에 편의 메서드를 하는게 좋은건가요? 3. 둘다 작성하면 안되나요? 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트에 관해서 말씀해주셔서 질문 드립니다.
안녕하세요. 수업 잘 듣고 있습니다. 강의에서 테스트에 관해서 말씀해 주셔서 질문 하나 남깁니다. 번외에 질문이라... 답을 주실지 모르겠지만 실제 현업에서 개발중에 테스트의 Fixture 가 많아지면서 점점 관리에 어려움을 느끼고 있는데 혹여 이런 것에 관리는 어떻게 하면 좋을지 노하우가 있을까요...? 그리고 앞으로의 수업도 기대하고 있습니다. 제대로 익혀서 실무에 적용해 보는것을 목표로 하고 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
update에서 form태그 질문드립니다.
updateItemForm.html에서 form태그에 action 속성이 없는데 어케 포스트매핑으로 갈 수 있나요??? ㅠㅠ 초보라 죄송합니당
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메소드에 궁금한 것이 있어 질문드립니다.
안녕하세요. 우선 양질의 컨텐츠 항상 잘보고 있습니다. 우연히 수강한 jpa 토크온세미나를 시작으로 이렇게 프로젝트 강의까지 오게되었습니다. 많이 배웠습니다. 정말 감사합니다. 다른게 아니라 엔티티 클래스 구현까지 강의를 수강 도중 연관관계 편의 메소드에서 궁금한 것이 있어 글 남겼습니다. 1. 현재 member의 소속 여부에 대한 처리 이를 테면 "Order" 엔티티 클래스에서, member가 orders에 현재 속하고 있는지 확인하고 만약 그렇다면 해당 Orders에서 member를 제거 후 변경된 member를 추가해야하는 것은 아닌지. public void setMember(Member member){ /* if(this.member.getOrders() != null){ this.member.getOrders().remove(this); } */ this.member = member; member.getOrders().add(this); } 그렇지 않으면 특이사항 이겠지만, Order의 member를 변경할 때 member.orders에서 문제가 생기지 않은가 싶어서 주석 부분을 패스하신 이유가 궁금합니다. 더하여 만약 Order의 Member처럼 현업에서 이렇게 변경 소지가 없는 필드 변수를 final 처리하는지가 개인적으로 궁금합니다. 2. 편의 메소드 위치 두번째로 편의 메소드를 어떤 객체가 갖는 것이 옳은가에 대한 고민이 듭니다. 저는 외래키의 주인이 되는, 이를 테면 Member와 Order의 경우 Order에 위치하는 것으로 생각했는데, Order와 OrderItem의 경우 order를 외래키로 주인이 되는 OrderItem이 아닌 Order에서 orderItem.setOrder을 호출하니 어떤 쪽에서 set를 갖는 것이 옳은가 정하기가 어렵습니다. public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } 혹시 현업에서는 이와 같은 상황에서 어느쪽이 '주' 가 된다를 정하는 규칙, 또는 다른 팀원을 위해서 표시하는 방법이 있는지 궁금합니다. ps. 더 좋은 질문을 가져오도록 노력하겠습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
설계 순서가 궁금합니다.
이 강의에서는 로직을 먼저 짜고 웹 계층을 개발하면서 미리 짜두었던 로직들을 이용해서 금방 끝났습니다. 이렇게 하면 정말 편리할 것 같지만, 한편으로는 페이지가 완성되어 있지 않는 상태로 로직을 짜려니 굉장히 어려울 것 같다는 생갂 또한 듭니다. 매개변수를 어떤 것을 넘겨줘야할지도 혼란스러울 것 같구요. 모든 것을 다 설계한 다음에 로직부터 짜는 것이 보통 일반적인가요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderItem 과 Item의 관계
Order와 Member나 OrderItem이나 Order 는 다대1 관계인데, Member은 order의 list를 가지고 있고 order 또한 orderitems의 list를 가지고 있습니다. 그런데 item은 왜 orderitem의 list를 따로 @OneToMany를 안해주는지가 궁금합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Member와 Item에 저장 할 때 다른 이유가 있나요?
Member 저장 ==========> public void save(Member member) { em.persist(member);} Item 저장 ==========> public void save(Item item) { if (item.getId() == null) { em.persist(item); } else { em.merge(item); }} 위와 같이 Member/Item 저장 방식이 다른 이유가 있나요? 답변 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문과 주문상품에만 생성 메서드가 있는 이유는 뭔가요?
다른 엔티티들과 달리, 주문과 주문상품은 상태값 외에는 바뀔일이 없기 때문에 생성 메서드를 사용한게 맞는지 궁금합니다. (사실 이 부분도 의문입니다. 다른 엔티티들에도 유지보수를 위해 생성 메서드를 사용하는게 맞지 않을까 싶습니다.) 예제에서 주문과 주문상품에서도 @Setter를 사용하고 있기에 언제든 값이 변경될 수 있는 점 때문에 제가 생각한게 틀린건지 맞는건지 잘 모르겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
merge 와 dirty check 질문
안녕하세요. 변경감지와 병합 챕터를 보고 질문드립니다. 말씀하신 내용중에 "merge 는 모든 필드를 업데이트하고, dirty check 는 변경된 부분만 업데이트하기때문에 dirty check 를 사용하는게 좋다" 라는 내용이 있는데요. 그래서 테스트를 좀 해봤는데 dirty check 로 update 쿼리가 날아가는 경우에도 모든 필드에 대한 update 쿼리가 날아가더라고요. 결국 실행되는 쿼리 자체는 merge 와 dirty check 가 동일한거같은데요. 그래서 제가 정리한건 "merge 보다 dirty check" 라기보다는 "기존 엔티티를 수정(update) 할때는 신규 객체를 만드는게 아니라 기존 엔티티를 찾아와서 하자" 인데, 이렇게 이해해도 될까요? + 조금 더 찾아보니까 하이버네이트에서 @DynamicUpdate 애노테이션을 지원하고있는데 이 애노테이션은 실무에서 적극적으로 사용하는지도 궁금합니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
다대다 관계 시 insert 질문입니다.
안녕하세요 영한님! 강의 들으면서 개인적으로 작은 프로젝트를 하나 만들어 보고 있습니다. 다대다 관계 시 insert 방법이 궁금합니다. 아래와 같이 erd가 구성되어 있습니다. 회원 테이블, 상품 테이블 그리고 회원이 찜한상품 테이블 총 3개가 있고 찜한상품 테이블이 회원과 상품 테이블을 연결하는 연결테이블입니다. entity는 테이블과 같이 총 3개를 생성했습니다. (@ManyToMany는 사용하지 않고 비식별관계로 만들었습니다.) 1) UserRepository를 생성해서 User를 저장하고 2) ItemRepository를 생성해서 Item을 저장하고 3) ItemLikeRepository를 생성하고 ItemLike 객체를 생성 후 저장된 User와 Item의 연관관계를 설정하고 저장 이렇게 3단계를 거쳐서 모든 데이터를 저장하고 있는데요. 연결테이블의 저장소인 ItemLikeRepository를 생성해서 저장을 해야 될까..? 라는 의문점이 듭니다. ItemLikeRepository는 save() 외에는 거의 사용할 일이 없을거 같은데 구지 생성을 해야 될까 생각도 들고.. 다대다 관계 저장 시 효율적인 방법이 있을까요?? 감사합니다.