강의 23:03분에서 setMember(Member member) 라는 setter 메서드를 작성하는데요. 제가 기억하기로는 @Setter를 설정하면 자동으로 필드 이름을 딴 setXXX() 인 setter가 만들어지는 것으로 알고 있습니다. 그러니까 현재 Member 필드가 있으니까 롬복인 @Setter 에 의해 setMember(Member member) 가 자동으로 생성되지 않을까 생각하는데요. 제가 생각한게 맞다면 이때 강의에서 만든 setMember(Member member)와 충돌? 이런 문제는 없나요? 시그니처까지 똑같은 것 아닌가요? 아니면 이런경우 사용자가 직접 만든 것이 더 우선시 되는건가요?
안녕하세요! 이번 강의 수강 중 서비스 인터페이스에 대해 궁금하여 글을 남기게 되었습니다. 흔히 스프링 프로젝트에서 보통 Service 인터페이스와 ServiceImpl 구현체로 나누어 개발하며 제가 참여하게 된 프로젝트 또한 이러한 구조였습니다. 이미 이전 개발자 분께서 Service 인터페이스와 ServiceImpl 구현체로 나눠놓은 상태였고, 제가 A 기능의 AServiceImpl 안에 특정 서비스 로직이 비대해짐에 따라 해당 코드가 명확하지 않다고 생각되어 메서드로 분리하게 되었습니다. A 엔티티의 상태, 계산 등의 로직으로 private 메서드를 두었습니다. 여기서 동료와 의견이 갈렸습니다: 동료 입장: 1. ServiceImpl 안의 모든 메서드는 반드시 인터페이스에 있어야 한다. 2. 인터페이스는 외부·내부 구분이 아니라, 구현체가 제공하는 기능을 보장하는 것이므로 전부 담아야 한다. 3. 내부 메서드를 둘 거라면 굳이 인터페이스로 추상화할 필요가 없고 그냥 클래스로 쓰면 된다. 제 입장: 1. 인터페이스에는 “외부 계약(=공개 API)”만 있어야 한다. 2. 구현체 내부에서만 쓰이는 로직은 private으로 감추는 게 맞고, 외부에서 호출할 필요가 전혀 없다. 3. 인터페이스를 구현체 내부 헬퍼까지 다 포함하면, 오히려 계약이 불필요하게 비대해지고 역할이 모호해진다. 핵심 쟁점 저는 public 메서드는 모두 인터페이스에 있어야 한다는 데에는 동의합니다. 또한, 단순 public, private 만 있다면, 인터페이스의 역할이 모호하다는 것또한 이해하지만, 이전 코드와의 일관성과 운영 중인 시스템에 대한 변경이 필요할정도의 중대사항이라고 생각하지 않습니다. 궁금한 점은 private/내부 헬퍼 메서드까지 인터페이스에 강제로 올리는 게 맞는지, 인터페이스를 사용하는 의의가 궁금합니다. 긴글 읽어주셔서 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 연관관계 를 사용할 경우 연관관계 주인을 설정해야 하는건 이해를 했습니다. @Entity public class Team { @Id @GeneratedValue private Long id; private String name; @OneToMany private List<Member1> members = new ArrayList<>(); } @Entity public class Member1 { @Id @GeneratedValue private Long id; private String username; @ManyToOne @JoinColumn(name = "team_id") private Team team; } 위와 같은 엔티티 구조일 경우 Team 에서도 Member1 에 대한 정보를 알수 있으며 Member1 에서도 Team 에 대한 정보를 알수 있습니다. 이후 둘의 데이터를 삽입한다는 가정하에 다음과 같이 Member 를 먼저 생성후 Team 에 입력할수도 있고 Member1 member1 = new Member1(); member1.setUsername("member1"); em.persist(member1); Team team1 = new Team(); team1.setName("teamA"); team1.getMembers().add(member1); em.persist(team1); 반대로 Team 을 먼저 생성한 뒤에 Member 에게 알려줄수도 있습니다. Team team = new Team(); team.setName("teamA"); em.persist(team); Member1 member = new Member1(); member.setUsername("member1"); member.setTeam(team); em.persist(member); 문제는 여기서 부터 인데... 연관관계 주인을 사용하는 이유는 JPA 에 혼란(?) 을 주지 않기 위함이다 라고 외우고 있는 상태입니다. "mappedBy 를 사용하여 한쪽에서는 쓰기만 가능하도록 동작하도록 한다. " 근데 이게 연관관계 주인하고 무슨 상관인지 잘 모르겠습니다. 그냥 둘다 읽고 쓰고 업데이트 다 가능해도 객체 입장에서는 큰 문제가 없을거 같은데.. 굳이 연관관계 주인이라는 개념을 도입해서 사용하는 이유를 잘 모르겠습니다. 가령 DB 에서는 Team 테이블의 ID 값이 변경이 필요할 경우 그 와 함께 연관되어 있는 Member 테이블에 team_id 값을 변경해줄수도 있고 반대 상황에서도 변경이 가능한데.. 뭔 차이 인지 잘 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의를 듣다가 생각나게 된 것이 앞서 배운 @MappedSuperClass가 생각이 났습니다. 이것도 각 엔티티에 공통된 속성을 정해줄 수 있었는데요. 어떤 차이점이 있는지 궁금합니다.
안녕하세요. 강의 정말 잘 들었습니다. 도움이 많이 되어서 수강평은 나중에 꼼꼼히 작성해볼 생각입니다~! ====================== 바쁘시면 이 부분만 읽으셔도 됩니다. ============= 배포 시 jenkins server에서 실제 서버에 배포할때 테스트가 돌아갈텐데 jenkins server에 compose를 통해 작동 하게 될 mysql에 DB schema insert 작업을 해서 동일하게 구조를 맞추고 테스트가 돌아가게 하는 게 좋은 생각일 까요? =========================================================== [세부 사항] 일단 테스트 코드가 local mysql에서 돌아가는 걸로 이해 했습니다. 배포 시 jenkins server에서 실제 서버에 배포할때 테스트가 돌아갈텐데 jenkins server에 compose를 통해 작동 하게 될 mysql에 DB schema insert 작업을 해서 동일하게 구조를 맞추고 테스트가 돌아가게 하는 게 좋은 생각일 까요? 현재 아직 jenkins 배포를 하고 있지는 않고 소스코드 개발중이라 머리속으로만 생각하는 상태입니다. 토비님 의견은 어떠신가요.....?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
이렇게 3단분리를 할때 처음부터 코드를 작성할때 이렇게 3가지 역할을 분리해서 각각 구현해야지! 라고 다 미리 설정해두고 코드를 짜는건가요 아니면 controller 에 일단 다 구현해놓고 그다음 분리해서 구현하는건가요?? 전자면 미리 생각하게 많아 뭔가 복잡해보여서요 ㅜ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 2번 멤버(HelloB)를 추가하는 코드를 실행한 뒤에 h2에서 조회해보면 1번 멤버는 없고 2번만 나와요
강의 36분 10초 경부터 관련해서 질문드립니다. 해당 시점에서 refMember는 getReference()하였으므로 프록시입니다. 그리고 바로 다음에 em.detach(refMember) 하여 영속성 컨텍스트에서 끄집어 낸다고 하시는데요. 그렇다면 getReference()하여 생성되는 프록시도 영속성 컨텍스트에 속하게 된다는 말씀인건가요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
@Transactional public void returnBook(BookReturnRequest request) { User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); user.returnBook(request.getBookName()); } 위 코드의 BookService 에서 책을 반납할때 userLoanHistory 중 user명과 책 이름이 같은것을 가져와서 userLoanHistory 에서 리턴하는데 문제는 한 사람이 이미 같은 책을 빌렸고 반납한 기록이 있다면 중복으로 잡힙니다. public void returnBook(String bookName) { UserLoanHistory targetHistory = this.userLoanHistories.stream () .filter(history -> history.getBookName().equals(bookName)) .findFirst() .orElseThrow(IllegalArgumentException::new); targetHistory.doReturn(); } 위의 User 엔티티에서 혹시 userLoanHistory 값이 여러개 나올때 혹시 .findFirst() 를 통해 그 중 가장 위 즉, 여기선 가장 최근에 대출한 책의 기록인 userLoanHistory 를 가져와서 doReturn()을 진행하는 형태가 맞습니까?
영상의 10분 38초 기준으로 Postman을 사용했을 때 결과가 다르게 나옵니다. 처음에는 "Error: connect ECONNREFUSED IPv4:8080" 라는 에러가 반복적으로 발생했습니다. 혹시 제가 뭔가 놓쳤나 싶어 인스턴스를 새로 만들어 시도해보고, 이전 섹션부터 다시 꼼꼼히 확인도 했습니다. 또, 중간에 인스턴스가 끊기는 문제가 있어 micro에서 small로 업그레이드까지 해보았는데요. 여러 방법을 시도했음에도 불구하고 지금은 500 Internal Server Error 만 발생하고 있어 해결책이 떠오르지 않아 질문을 남깁니다.
mappedBy를 정확히 뭐라고 이해해야할지 잘모르겠습니다. 양방향 연관관계 설정을 위해서 필요한 것은 알겠으나 그 용어의 개념?이라고 할까요 뭐라고 이해해야할까요? 이전 양방향 연관관계와 연관관계의 주인 1- 기본 에서는 반대 편에 어떤 것이 걸려있는지 이런식으로 용어를 설명하셨는데 이번 강의 11분 44초와 13분 31초 부터 설명하시는 것을 보면 mappedBy를 통해 연관관계 주인이 누구로 설정되어있는지 알려주는 듯한 설명을 하시는데요 그냥 단순 mappedBy라는 용어 개념을 이해하려면 전 강의에서 설명하셧듯이 단순히 어떤 것이랑 연결되어있는지로 이해하면 될지 아니면 이번 강의에서처럼 연관관계 주인이 어떤 것으로 설정되어있는지 알려주는 것으로 이해하면 될지 궁금합니다
주문 목록을 화면에 뿌려줄 때 N+1 문제가 발생하는 것을 확인하고 페치 조인으로 이를 해결해보았습니다. OrderRepository.java public List<Order> findAllByString(OrderSearch orderSearch) { String jpql = "select o from Order o join fetch o.member m join fetch o.orderItems oi join fetch oi.item"; ... } 다른 부분은 건들지 않고 문자열 jpql 만 위와 같이 변경했습니다. 이처럼 변경 후 확인을 해보니 N+1 문제 없이 한방 쿼리로 주문 목록을 가져오는 것을 확인했습니다. 하지만, 기본편에서 페치 조인 대상에는 별칭을 줄 수 없다고 하셨습니다. 물론 하이버네이트는 되지만 아래의 이유 때문에 가급적 사용을 금한다고 말씀하셨습니다. 위의 o.member m 를 예로 들면 where 절에서 m.name like 와 같이 몇개만 따로 가져오는 것은 JPA가 설계한 관련된 것들을 싹 가져온다 의 방향과는 맞지 않기 때문입니다. 여기서 질문이 있습니다 질문 1) where 절에 member에 대한 조건이 없으면 별칭을 쓰지 않아도 될거같은데 이처럼 있는 경우는 어떻게 하면 될까요? (이 부분에 대해서 활용 2편에서 다뤄주시면 그렇다라고만 답해주셔도 됩니다) 질문 2) 기본편에서 페치 조인을 여러 단계 하는 경우는 간혹 별칭을 쓸 수 있다고 하셨는데 그게 위의 o.orderItems oi 에 해당될까요? (여기에 별칭을 안주고는 도저히 item을 가져올 방법이 떠오르지 않습니다..)
안녕하세요 토비님 가의 잘 보고 있습니다. DDD는 처음이고 헥사고날방식도 처음이라 질문 수준이 낮은 점 양해 부탁드립니다! 이 강의까지 보고나서 전체코드를 봤을떄 궁금한 점들이 있어서 질문 드립니다! 1번 질문: @Entity public class Member { @Embedded private Address homeAddress; } @Embeddable public class Address { private String city; private String street; private String zipcode; } @Embeded사용할때 데이터 필드를 의미 있는 하나의 묶음 이라는 의미로 사용하는데 profile 이나 email같은 경우에는 컬럼이 하나여도 @Embeded 로 묶으셨는데 그 기준(언제 사용해야하느지)가 궁금합니다. 저라면 그냥 생각 없이 String 으로 받았을거같은데 ….! 2번 질문 : Aggregate root 로 접근해하면 메서드 체이닝 비슷하게 일어나는거 같은데 그런 점은 괜찮나요!? 3번 질문 :. Aggreagate root로 접근하는 방식은 DDD에서만 사용하는지 ?? 기존 JPA + 레이어 아키텍쳐에서도 사용이 가능한건지....? 4번 질문 : 강의에서는 1:1 이였지만 , ManyToOne 단방향 , ManyToOne OneToMany 양방향 관계에서도똑같이 Aggregate root로 접근해서 데이터를 처리해야하는지..? 미리 감사드립니다!!