묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA에서 엔티티를 삭제 혹은 업데이트 할 때 리턴에 대해 질문드립니다.
안녕하세요! 엔티티를 JPA로 삭제 혹은 업데이트 처리 후에 반환형이 void 아니면 해당 엔티티의 id 값을 반환 받는데요. 혹시 삭제나 업데이트를 하는 와중에 DB커넥션 오류가 발생한다면, 개발자 입장에서 Repository에서 오류가 난 뒤 에러처리를 어떻게 할 수 있을까요? 답변 기다리겠습니다. 감사합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
URI 구조 질문
안녕하세요 영한님 야생형코스를 듣고 토이프로젝트를 하던 도중 URI를 어떤 식으로 정해야 할지 감이 안잡혀서 활용1편에 있는 컨트롤러들의 URI를 참고하는 도중 궁금한점이 생겨서 여쭈어보게 되었습니다. MemberController와 ItemController의 등록과 관련된 URI에서는 /members/new , /items/new와 같이 복수단어를 사용하였지만 OrderController에서는 /order와 같이 URI가 단수로 되어있었습니다. HTTP 강의 중 비슷한 내용이 있던게 기억나서 찾아보았더니 HTTP 메서드 부분에서는 "계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장(member -> members)" 이라고 설명해 주셨지만 혹시나 order의 경우 다른 뜻이 있으셔서 URI를 단수로 작성한건지 궁금해서 여쭈어 보게 되었습니다!
-
미해결실전! 스프링 데이터 JPA
더티체킹
안녕하세요 학습을 진행하던 중 궁금한 사항이 생겨 질문드립니다. 다름이아니라 더티체킹에 관한것인데요 ```java @Transaction public User updateAuthority(String userName, UserRole new Role) { User user = userRepository.findByUserName(userName); System.out.println("---변경 감지 시작 ---"); user.setRole(newRole); System.out.println("---변경 감지 끝---"); return user; } 아래와 같은 메소드를 실행시켜서 더티체킹이 언제 감지되나 실험해보았는데 보니까 return user를 하고 나서 실행되는거 같더라구요. 혹시 더티체킹이 끝나서 DB에 update 쿼리가 나가는 시점이 정확히 알 수 있을까요? 수업 너무 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Mockito 를 사용하여 테스트할 때, 테스트 요구사항의 반영 질문
이번 강의의 1분 30초 쯤, 현재 작성하는 테스트 방법이 그다지 좋은 방법은 아니다라는 말을 들었습니다. 그래서 좋은 테스트 방법은 무엇인지 찾아보게 되었고 돌아돌아 Mockito 같은 테스트 프레임워크를 알게되었습니다. 좋은건 일단 맛은 봐야하는 성격이라, 강의를 듣다말고 Mockito 를 사용하여 단위 테스트 하는 방법 알아보는 길로 한참 새버렸습니다 ㅎㅎㅎ Mockito 를 사용해서 OrderService 의 주문 성공에 대한 테스트 코드를 작성해보았습니다. 근데 영한 선생님이 강의에서 작성할 때의 assertEquals 이나 그런 요구사항들에 대해선 테스트를 못해서 제가 테스트 코드 작성을 잘못한건가 하는 생각이 들었습니다. 코드는 다음과 같이 간단하게 작성했습니다. @ExtendWith(MockitoExtension.class) class OrderServiceTest { @Mock MemberRepository memberRepository; @Mock ItemRepository itemRepository; @Mock OrderRepository orderRepository; @InjectMocks OrderService orderService; @Test @DisplayName("주문 성공") void order() { Member member = new Member( 1L, "irostub", new Address("seoul", "street", "10000"), new ArrayList<>()); Item item = new Book( 1L, "itemName", 15000, 2021, new ArrayList<>(), "5pg", "isbn5100"); //given given(memberRepository.findOne(anyLong())) .willReturn(member); given(itemRepository.findOne(anyLong())) .willReturn(item); //when orderService.order(1L, 1L, 100); //then ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class); then(orderRepository).should(times(1)).save(captor.capture()); } } 코드는 위와 같습니다. 뭔가 많이 허전합니다. 강의에서 처럼 assertEqual()에 인자로 넣을 객체를 받아올 방법이 없어서 , orderRepository.save(...) 는 void를 반환하고 orderService.order(...) 은 Long 을 반환하지만 영속성 컨텍스트도 없으므로 null 을 반환합니다. 그래서 결국 테스트 한 것이라곤, Mock 을 통해 적당한 맴버, 상품을 정해놓고 orderService.order(...) 메서드를 실행중에 orderRepository.save(...) 을 잘 호출했는가? 뿐입니다. 이렇게 하는게 맞는걸까요..? (테스트에 대한 강의가 아님에도 이런 질문을 하는게 죄송스러울 따름입니다..ㅠㅠ 근데 어디다 물어볼 곳도 없어서 심란한 마음에 글을 씁니다)
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 관련한 equals()오버라이딩, 제가 이해한 것이 맞나요?
덕분에 스프링, JPA 말고도 자바 전반에 걸쳐서 정말 많은 걸 재밌게 배우고 있어서 감사드립니다. 공부를 해도 의문이 해소되지 않는 부분이 있고, 제가 이해하는 것이 맞는지 확신이 안 가는 것들이 있어 질문드립니다. 1. 왜 2:23초 정도의 equals() 오버라이딩에서, 클래스 비교를 instance of가 아니라 !=로 하였는지 프록시로 생성된 객체는 원본 클래스를 상속한, 생성된 클래스에 속하기에 equals 오버라이딩 할 때, ==이나 !=를 이용한다면 적절한 구현이 이루어질 수 없지 않나요? 1) 기본적으로 instance of를 써야 프록시로 생성된 객체가 원본 클래스와 적절하게 동등성 비교가 가능하다고 알고 있었습니다. 2) 한편, 실전예제에서 instance of를 사용하지 않은 것이 값 타입이라서 그런것이 아닌가 추측했습니다. 왜냐면 값 타입은 식별자를 갖지 않기 때문에 getReference() 메서드로 프록시를 가질 일 자체가 없어서 위의 문제가 발생하지 않으리라는게 제 추측이었습니다. 이와 관련해서 의문이 들었던 부분이: 2. 이전 강의(값 타입 컬렉션)에서 값 타입 컬렉션에 대해 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성해야함: null 입력X, 중복 저장X 이라고 정리했었는데, 그렇다면 값 타입 컬렉션의 경우 PK가 존재하는 것인가요? 또, 그걸 통해서 find나 getReference가 가능한 건가요? 별개로, 값 타입이 불변 타입으로 사용되기에 equals 오버라이딩이 필요하다는 점은 이해했습니다. 마지막으로 3. getter를 사용해서 equals나 hashCode 메서드를 구현하는 것이 프록시 문제를 피해갈 수 있다는 것이 이해가 가지 않습니다. 오히려 저는 getter 사용이 아니라 클래스 판별 부분을 ==로 하지 않고 instance of로 하는 것이 더 맞다고 생각했습니다. 그 이유는 1) 제가 보기에, 위에서 언급했듯이, 프록시가 비교에서 문제가 발생하는 부분은, 프록시로 얻은 객체는 원본 객체와는 다른 클래스(JPA에 의해 생성된, 원본 클래스를 extends 하는 클래스)라는 점이기에 그렇습니다. 2) getter 사용이 아니라 instance of 사용이 프록시와 연관이 있다고 IntelliJ가 안내문으로말해주는 것 같아보였습니다. 단축키로 equals와 hashCode 메서드를 생성하려고 하면 다음과 같은 안내문이 나왔었는데요: generate equals() and hashCode() Accept subclasses as parameter to equals() method While generally incompliant to Object.equals() specification accepting subclasses might be nessesary for generated method to work correctly with frameworks, which generate Proxy subclasses like Hibernate. 생성된 메서드를, 하이버네이트처럼 프록시 서브클래스들을 만드는 프레임워크들과 호환시키고 싶으시다면, 일반적인 Object.equals() 규격과 다르게, 서브클래스들을 포함시키는 것이 필요할 수 있습니다. Use getters during code generation 해당 클래스에 getter 만들지 않으면 당연히 위 옵션을 체크하더라도 getter 메서드 사용하지 않고 구현된다. 제가 잘못 번역한 것인지는 모르겠습니다만 위의 안내문은 제가 위에서 생각했던 것처럼 서브클래스를 포함시키는 것 (!=으로 동등 클래스만 포함시키는 것이 아니라 instance of로 서브클래스까지 포함시키는 것) 이 하이버네이트 등의 프록시 서브클래스 문제를 해결해준다고 말하는 것 같았기 때문입니다. 공부가 얕아서 질문이 많았습니다. 하이버네이트에서 실제 프록시를 생성하거나 할 때 무언가 제가 모르는 부분이 있는 것은 아닌가 해서 하이버네이트 라이브러리에서 em을 extends 하는 Session이나 SessionImpl을 뒤져 보기도 했는데, 도통 답을 찾기가 어렵네요. 도움이 필요합니다..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강사님 안녕하세요. 강의 항상 잘 듣고 있습니다.
질문은.. 강의랑 똑같이 했는데 이상하게 whitelabel error page만 보이네요.. 혹시 datasource 설정해줘야하나 해서 추가해봤는데도 안 되고.. 1편 강의처럼 Spring Security 때문도 아니고.. 원인을 못 찾겠어서 문의드립니다..
-
미해결
스프링 부트와 JPA 활용 2 강의 듣던 중 로드맵이 궁금해서 질문남깁니다.
안녕하세요 현재 스프링 기초 강의 부터 JPA 기초, 실전 1 까지 들으며 야생형 로드맵을 따라가고 있습니다. 그런데 활용 2편 강의를 아직 초반밖에 보지 않았지만 중간중간 MVC 이야기를 하셔서 MVC 파트가 선행 되어야 하는건지 아니면 이 강의를 먼저 끝내고 들어도 되는건지 더 효율적인 학습 순서가 어떻게 되는지 알려주세요 ㅎㅎ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
멀티스레드 환경 변경감지 동시성 관련 질문
안녕하세요 ! JPA 관련 강의를 전부 듣고 개인적으로 공부를 하던 과정에서 궁금한점이 하나생겨 문의드립니다 ! Book이라는 엔티티가 존재하고 수량이라는 컬럼이 존재한다고 가정하고 고객들이 주문을 하게되면 수량이 계속해서 감소하는 로직을 구현했을경우 고객이 동시에 Book을 주문하려고 하는 상황에서 고객1 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객2 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객1이 Book 10개를 주문하여 수량이 10개 감소한상태로 변경감지로 업데이트문이 나갈텐데 고객2에 주문전 Book 엔티티는 10개가 감소한 10개인상태에서 차감이 이루어져야할것같은데 WEB환경에서는 서로다른 트랜잭션에서 DB를 처리하게되므로 고객2에 주문전 Book 엔티티는 여전히 20개인상태에서 주문한 수량만큼 차감되어 업데이트가 실행되 두개 주문사이에 수량이 맞지않는 현상이 발생할것같은데 멀티스레드환경에서 각 엔티티가 동시성을 지원하는지 혹은 이러한방법으로 개발하는걸 지양해야하는지 궁금합니다 !!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
clear()이후에도 Id값이 남아 있는 이유? (10:40)
앞서 많은 분들이 질문하셨지만, 아직 명확하게 이해가 되지 않아서 질문드립니다. 10분 40초 부분의 getReference() 조회 시, Id 값은 이미 있기 때문에 쿼리가 날아가지 않는다는 것에 대한 의문입니다. 우선, 의문이 들었던 지점입니다. Member 엔티티의 Id를 GeneratedValue 방식 사용하는 상황에서, 1 em.persist(member) ;2 3 em.flush();4 em.clear();5 6 em.getReference(Member.class, member.getId());7 8 System.out.println("findMember.id = " + findMember.getId()); 위와 같은 코드를 실행했을 때 상황입니다. 1) 제가 이해한 위 코드 실행시 발생하는 일을 순서대로 정리해보면: 1행: em.persist(member); (1) DB의 전략에 따라 DB에서 ID값을 generate하고, (2) 생성된 ID값이 1차캐시의 key로 저장된다. 4행: em.clear(); (1)영속성 컨텍스트가 완전히 비워진다: 즉 1차 캐시에 저장된 Id값도 비워진다. 6행: em.getReference(Member.class, member.getId()); (1)1차캐시에서 id값을 찾음 (2)4행의 (1)로 인해서 캐시에서 Id 값을 찾을 수 없기에 DB에 SELECT 쿼리를 던지게 된다. 2) 때문에 "Id값이 이미 있기 때문에 INSERT 쿼리가 날아가지 않는다"는 것이 이해가 되지 않습니다. 구체적으로 궁금한 것은 (1) 위에서 말하는 저장된 id값이 어떻게 저장되었냐는 것입니다. (2) id값이 이렇게 저장되는 것은 어느 시점에서 이루어졌냐는 것입니다. 두 문제에 대한 제 생각은 (1) 영속성 컨텍스트에 저장된 것이 아니고, member 인스턴스의 변수 member.id가 다른 인스턴스 변수들처럼 관리되어서 저장된 것이다. (즉 우리가 비영속 상태의 인스턴스 book에 book.setName("Jpa")하는 식으로 값을 저장할 때처럼 저장되는 것이다) (2) 1행의 (2), 즉 1차캐시의 key로 저장되는 시점에 저장되었다. 인데, 이 이해가 적절한 것인지 궁금합니다. 즉, <영속화되는 엔티티의 id값은 DB에서 생성되어, 1차캐시에 저장되는 시점에 인스턴스 변수에 저장된다.> 그리고 <그 id값은 해당 인스턴스와 동일한 생명 주기를 갖는다>가 적절한 이해인지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
List<Member> members만 New ArrayList로 객체를 생성해주는 이유가 있나요?
안녕하세요 김영한님,List<Member> members만 New ArrayList로 객체를 생성해주는 이유가 있나요? npe를 방지하기 위해서라면 String도 생성해서 객체를 넣어주어야 하는거 아닌가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
객체지향에 대해 궁금한 점
안녕하십니까 강사님 객체지향에 대해 궁금한 점이 생겨 질문드립니다. 17:05에서 order라는 메서드 안에 createOrderItem, createOrder 메서드들이 있습니다. 이 두 메서드는 OrderService 입장에서 OrderItem과 Order한테 "니네가 무슨 일은 하는지는 모르겠지만, 나는 이 두 개를 받아서 주문을 생성한다"라는 말이잖아요? OrderService가 하는 일은 OrderItem과 Order에서 받은 것들을 이용하여 주문 생성 OrderItem이 하는 일은 주문 상품 생성 Order가 하는 일은 주문 생성 그렇다면 이게 객체지향성을 나타내는 것일까요? 감사합니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블 구조 질문
이 그림에서 동그라미가 무었을 의미하는지 잘 모르겠습니다.
-
미해결실전! 스프링 데이터 JPA
데이터베이스 설계 시에서 일반적인 상황에 대해 여쭤보고싶습니다!
안녕하세요 강사님! 강사님의 강의 영상을 보고 Spring Data JPA 를 학습했던 학생입니다. 다름이 아니라 데이터베이스 설계 시에 다음과 같은 상황에서는 어떤 방법이 일반적인지 실무의 관점에서 조언을 얻고자 합니다. `USER`, `COURSE`, `ASSIGNMENT`, `ASSIGNMENT_SUBMIT` 이렇게 4개의 테이블이 있다고 가정할 때, USER : 사용자 테이블 COURSE : 강의 테이블 ASSIGNMENT : 과제 테이블 ASSIGNMENT_SUBMIT : 학생이 제출한 과제 테이블 ASSIGNMENT_SUBMIT 테이블의 PK가 어떤 형태로 되어야 하는지 각각의 장단점에 대해 생각을 해보았습니다. 1. id 라는 칼럼을 만들어서 Auto_Increment 로 pk 를 관리한다. - 장점 - findById 에서 숫자 인덱스를 이용한 조회를 하기 때문에 조회 속도가 빠르다. - 단점 - 칼럼 하나가 늘어난다. 2. user_id 와 assignment_id 라는 두 개의 칼럼을 이용해서 pk로 관리한다. - 장점 - id 칼럼이 사라진다. - 단점 - jpa 에서 제공하는 기본 findById 가 사라진다. - fk 를 결합하여 pk 를 만드는 레퍼런스를 찾지 못했다.. 정도 있습니다. 만약 강사님이시라면 어떤 선택을 하실지 또한 각각 어떤 장단점이 더 있을지 알려주실 수 있으실까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member_Id, item_id,order_id 가 공유되는거 같은데 따로 할려면 어떻게 해야하나요?
4:33에 order 하나 만들었는데 #3이 되어있어서 확인해보니까 멤버 하나 만들면member_id=1 아이템 하나 만들면 item_id=2 주문 하나 만들면 order_id=3 이런식으로 id가 공유되는거 같은데 @GeneratedValue 때문인가요? 각각 따로 id를 만들어줄려면 어떻게 해야하나요?
-
해결됨실전! Querydsl
내부조인 on 사용
안녕하세요 영한님 저는 jpa 야생형 로드맵을 수강한 후 토이프로젝트를 진행하고 있는 도중 여쭈어보고 싶은게 생겨서 글을 올리게 되었습니다. 먼저 해당 강의를 통하여 내부조인을 사용하면, where 절에서 필터링 하는 것과 기능이 동일하기 때문에 where절의 의도와 맞게 내부조인에서는 on절이 아닌 where절을 사용하는게 좋다고 이해하였습니다. 아래 사진은 파라미터가 Item의 name에 포함된 경우 해당 Item의 관련된 여러 테이블을 join하여 Shop을 조회하고 싶어서 작성하게 된 코드와 실행했을 때 나타난 쿼리입니다. 처음에는 findByNameContainsV1 메소드를 작성하였지만 Item부터 Shop 사이에 있는 모든 테이블을 조인한 후 where절에서 Item의 name과 같은 Shop을 조회하기 때문에 조금 더 쿼리를 최적화 시킬 수 있다고 생각했습니다. 그래서 findByNameContainsV2 메소드를 작성하게 되었는데요. sql 문법상 join이 where보다 먼저 실행된다고 알고 있었기 때문에 where 대신 on절을 넣어주었습니다. 하지만 테스트를 통하여 on절에도 동적쿼리를 사용할 수 있는지 확인해 보았지만 불가능했습니다. 아직 개발에 대한 지식이 많이 부족해서 성능 최적화에 대해 잘 모르지만 저는 findByNameContainsV2 메소드가 findByNameContainsV1메소드보다 더 성능이 잘 나온다고 생각이 되지만 QueryDSL은 JPA에서 동적 쿼리를 사용하기 위해 실무에서 도입하게 된 것이므로 굳이 고민하지 않아도 되는 것인지, 아니면 실무에서 동적쿼리가 아닌 경우에 findByNameContainsV2 메소드와 같이 코드를 작성해도 되는지 영한님의 의견을 여쭈어 보고 싶습니다.
-
미해결실전! 스프링 데이터 JPA
Auditing transaction
안녕하세요, auditing 강의를 듣고 적용해보았습니다. 게시글을 처음에 만들때 원하는 값들이 잘 들어가지만 게시글을 수정하여 다시 저장할 경우audit 부분에서 createdBy, modifiedBy 를 못가져오면서 transaction 에러를 냅니다..! 혹시 실무에 적용하기 위해 추가로 적용해야 할 부분이 있을까요? 아마 AuditorAwareImpl에서 @Autowired MemberRepository memberRepository; 부분이 이상한 것 같은데...이유는 모르겠습니다 ㅠ_ㅠ public class AuditorAwareImpl implements AuditorAware<Long> { @Autowired MemberRepository memberRepository; @Override public Optional<Long> getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (null == authentication || !authentication.isAuthenticated()) { return null; } DefaultOAuth2User principal = (DefaultOAuth2User) authentication.getPrincipal(); String email = (String) principal.getAttributes().get("email"); if(email == null ){ return null; } Member member = memberRepository.findByEmail(email).orElse(null); if(member == null){ return null; } return Optional.of(member.getId()); } }
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
spring MVC와 REST API차이의 개념이 궁금합니다.
제가 이해한건 Spring MVC와 REST API 개발의 차이는 VIEW를 반환하는가 아니면 JSON의 데이터를 반환하는가의 차이인데 제가 이해한것이 맞나요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
세션 2개 상황에서 동시성 문제
스승님 그간 평안하셨는지요,, 다름이 아니라 불초의 제자 질문이 있어 이 야심한 시간에 편지 올립니다. WAS를 한대만 운용한다는 가정하에 사용자의 접속 세션 허용범위를 2개로 주었어요, 웹으로 접속함과 동시에 모바일에서도 접속이 가능하게 만들어 주었다고 생각해 보았습니다. 전에 아래와 같은 말씀을 해주셨는데 ---------------------------- 서버가 한대만 있고, 자바(JVM)로 웹 애플리케이션을 단 하나만 구동하는 상황이면 자바 만으로 동시성 제어를 할 수 있습니다. 그런데 실무에서는 보통 서버 두 대 이상을 사용하기 때문에, 동시성 제어를 JVM안에서 해결하는게 어렵습니다. 관계형 데이터베이스는 이런 동시성 제어를 고려해서 개발되었기 때문에, 결국 관계형 데이터베이스에 동시성 제어를 위임해야 합니다. 그 중에 관계형 데이터베이스가 제공하는 유니크 제약조건을 사용하면, 같은 이름을 절대로 동시에 저장할 수 없습니다. 그래서 name에 유니크 제약조건을 실무에서는 걸어주어야 한다고 이야기 했습니다. 그런데 이런 유니크 제약조건은 정말 최악의 경우(진짜 초 단위로 같은 데이터가 저장되었을 때)가 발생했을 때 동작하는 것이고, 대부분은 validation에서 막힙니다. ----------------------------- 위에서 제가 가정한 상황에서 사용자가 웹이랑 모바일에서 동시에 요청을 보냈는데 그게 하필 동시성 문제를 일으킨다면 이런 상황에서도 데이터베이스 lock을 안걸고 자바만으로 동시성을 제어할 수 있는 방법이 있을까요?? (혹은 세션이 2개가 아니더라도 1개의 세션에 1 명의 사용자가 동시에 같은 요청을 보낼 경우에두요!,, 너무 여러개 번거로운 질문 죄송합니다 ,, ㅠㅠ)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 JPA join에 관련해서 질문이 있습니다.
안녕하세요. 질문은 2가지 정도가 있는데 다음과 같습니다 1. DTO를 반환하는 형태의 JPQL를 작성할 때 join문을 사용해서 쿼리를 작성해주셨습니다. 문득 로그를 보다가 든 생각이 DTO가 아니라 entity를 조회하기 위해 JPQL을 작성할 때, join을 사용하면 즉시로딩이나 지연로딩 관계없이 연관객체에 대해서 N+1문제가 발생하는 걸로 알고 있습니다. 근데 DTO를 반환하는 형태로 JPQL를 작성할 때는 join문을 사용해도 쿼리 한번에 연관객체들의 정보를 가져오더라구요 (강의에서 Order의 Member나 Delivery) 이러한 차이의 이유가 JPQL이 실행 될 때 JPA에서 관리를 하냐 안하냐의 차이로 볼 수 있을까요? 2. JPA는 트랙잭션 안에서만 동작한다고 알고 있습니다. 그런데 강의를 보다보면 Controller에서 Repository를 바로 의존성 주입받아서 사용하시더라구요. @Transaction은 서비스에만 붙어있고 Repository에는 선언되어 있지 않은데 정상적으로 동작하는 것은 조회는 트랙잭션 관계없이 JPA에서 사용이 가능한것인가요? 그 서비스 코드를 작성할 때 조회 메서드는 readOnly속성을 true로 주면서 작성했던 걸 보면 조회할 때도 @Transaction이 선언되어야 동작하는것이 아닌가 하는 생각이 들어서 질문 남겨드립니다. 항상 명강의 해주셔서 감사합니다. ps. MSA와 관련한 강의는 계획이 없으신가요? ㅎㅎ
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Collection type으로 Set 대신 List를 사용하는 이유가 있는지요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 관련 질문: https://www.inflearn.com/questions/216545 추가 내용이 있습니다. 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] Collection type으로 Set 대신 List를 사용하시는 이유가 궁금합니다. 지금까지 나온 Collection들이 모두 unique한 Entity(또는 값 타입)들의 collection이기 때문에, Set을 활용할 경우 중복 확인 관련 부분이 깔끔해지고, 다른 질문의 답변에서 답해주신대로 값 타입 컬렉션에도 row를 모두 날리고 다시 넣는 문제를 막을 수 있어 Set에 대해 좋은 인상을 가지게 되었습니다. 그런데 기본적으로 예제가 List를 사용하여, Set을 사용하였을 때 제가 놓친 문제가 있는지 의문이 들었습니다.