묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
JPA와 Transaction에 대해서
안녕하세요. 선생님! 오랜만에 또 질문남깁니다..! 강의내용에서 JpaRepository의 구현체에 @Transactional 애노테이션이 붙어있기 때문에 서비스계층에 없어도 트랜잭션이 적용된다고 하셨습니다. JPA의 모든 변경은 트랜잭션 안에서 동작한다고도 하셨구요! 여기서 질문입니다. Repository를 직접 정의하고 사용할 때, @Transactional 애노테이션 없어도 동작하는 이유는 뭔가요? 더 쉬운 예제로 Controller에서 em.find() 호출이 가능한데, 이유가 뭔지 궁금합니다.. EntityManger의 구현체에 @Transactional이 붙어있나 싶어 em.getClass()를 찍어보았는데, class com.sun.proxy.$Proxy113 이렇게 찍혀서 구현체를 어떻게 봐야하는지를 모르겠어요.. @RestController @RequiredArgsConstructor public class MemberApiController{ private final EntityManager em; @GetMapping("/api/v1/member") public Member getMemberV1(){ return em.find(Member.class, 1L); //트랜잭션 설정을 안했는데 왜 가능할까요? } }
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
플러시 관련 질문드립니다.
flush()를 했을 때 1차 캐시에서 Entity와 스냅샷이 다를 경우 쓰기 지연 SQL저장소 update 쿼리를 에 만들고 나면 Entity값과 스냅샷 값은 같아지는 것인가요?! 당연히 변경된 Entity값이 스냅샷에 저장되면서 같아질 것이라고 생각은 하는데 혹시나 하여 질문합니다. 선생님 강좌 너무 잘 듣고 있습니다. 왜 이 좋은 강좌를 이제야 알고 수강하는지 모르겠습니다. 눈높이에 너무 잘 맞추어 설명해주시는것 같습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
joinColum 질문있습니다.
안녕하세요 영한님. 복습을 하다 궁금한 점이 생겨 질문드립니다. 소스에서 ManyToMany 양방향의 경우 @JoinTable을 주인쪽에 다셧는데, @JoinTable을 주인쪽에 다는게 맞다고 알면 되는 것일까요?? 감사합니다~
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade 질문 있습니다.
안녕하세요. 복습을 하다 궁금한 점이 생겨 질문을 남깁니다. 영한님 소스에서 양방향인 경우 cascade 옵션을 사용한 부분이 있는데, 한번은 주인인쪽에, 또 다른 한번은 mappedBy쪽에 사용했습니다. 1. casecade 옵션은 어느쪽에 다는게 좋은건지 궁금합니다. 2. 만약 양쪽 다 달아도 상관 없는건 지도 궁금합니다. 실무에서 사용법을 몰라 양쪽에 달아두었는데, 문제가 있을거 같아 걱정이 되네요 ㅠㅠ 감사합니다~
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v3 와 v6 질문드립니다.
안녕하세요 김영한님 항상 질 높은 강의 잘듣고있습니다!! 다름이 아니라 강의를 듣다보니 v3랑 v6의 차이점에 대해서 제가 생각한 부분이 맞는지 질문드립니다. v3의 경우 중복을 제거하기 위해 distinct라는 명령어를 사용하고 v6의 경우에는 로직을 추가해서 중복을 제거했습니다. 두 가지가 실제 쿼리의 조인은 비슷할거라 생각합니다. 그렇다면 차이는 1. select 해오는 컬럼들을 선택할 수 있다? v3의 경우 전부다, v6의 경우 dto에 정의된 필드만 2. 컬렉션 값이 2개 이상이여도 사용 가능 의 차이 정도로 이해하면 될까요
-
미해결실전! 스프링 데이터 JPA
@Query 에 countquery를 설정했음에도 안나간는 경우?
안녕하세요 정말 좋은강의 잘듣고 있습니다. 혹시 countquery옵션을 설정했음에도 안나가는 경우가 있을까요? 이전 jpa 활용2 에서 order 객체를 기반으로 springdata jpa repository 를 만든후 아래와 같은 메서들를 정의했는데 @Query(value = "select o from Order o join fetch o.member m join fetch o.delivery d",countQuery = "select count(o) from Order o")public Page<Order> findAllWithMemberDelivery(Pageable pageable); 결과값은 count 문없이 아래와 같은 쿼리만 나가네요 select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id limit ? 혹시 inner join 이라 따로 다시 조회할 이유가 없어서 스프링에서 최적화해서 따로 쿼리가 나가지 않은건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문드립니다!
제가 도메인, 서비스, 레포지토리 같은것들을 자바를 공부하며 처음 알게되었는데요 도메인이라고 하면 계속 www 같은 도메인이 떠오르네요 domain: 엔티티객체의 모음 service: 비즈니스로직 repository: 엔티티객체를 활용한 jpa코드사용 이렇게 생각하면 될까요?? 그리고 웹어플리케이션을 만들때 만들기 나름이겠지만, 쿠키나 세션을 사용해서 로그인처리를 하는지 jwt를 사용하시나요?? 대부분의 웹서비스는 jwt필요없이 쿠키만으로 충분하다는 어느 유튜버분의 의견도 있던데 어떻게 생각하시는지 궁금합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberServiceTest - 테스트에서 @Transaction의 롤백기능이 수행되지 않습니다
안녕하세요.올려주신 강의 잘 듣던 중 궁금한 점이 생겨 질문드립니다. @Transactional을 테스트 케이스에서 쓸 경우에는 커밋이 안되고 롤백을 한다고 하셨는데, MemberServiceTest에서 만든 2개의 테스트 중 중복_회원_예외() 메서드 실행 시에는 아래 로그에 INSERT쿼리가 나와서요... 회원가입() 메서드 테스트 시에는 INSERT쿼리가 로그에 찍히지 않는데 중복_회원_예외() 메서드에는 INSERT쿼리가 찍히는 이유가 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade 옵션 질문
안녕하세요.강의 잘 듣고 있던 도중 궁금한 점이 생겨서 질문드립니다.엔티티 설계시 주의점 21분쯤에 cascade옵션에 대해서 설명해 주셨는데, 왜 Order 엔티티에 있는 필드값에만 이를 적용하고 다른 곳에는 적용하지 않으셨는지 궁금합니다. 또한, 어떤 기준을 통해 cascade 옵션을 적용시켜야 하는지 궁금해서 여쭤봅니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원과 상품에서 id값
처음 회원을 등록하면 회원목록에서 #이 1이 뜹니다. 이후 상품 등록을 하고나서 상품 목록을 조회해보니 #2가 뜹니다. 혹시나해서 회원을 하나 더 만들어보니 #3이 추가가 되었습니다. id값이 부여가 되는 것이 테이블별로 이루어지는 것이 아닌 건가요?
-
미해결실전! 스프링 데이터 JPA
@QueryHint의 readOnly 와 @Transaction의 readOnly 차이
안녕하세요. @QueryHint 의 readOnly 속성과 관련하여 질문있습니다. 이전의 강의(jpa 활용 1편) 에서 service 단에 @Transaction(readOnly=true) 설정을 주었을 때 영속성 context flush (X), dirty checking (X) 를 통해서 성능을 최적화하고 DB에 읽기 전용임을 알린다고 배운게 기억이 나서요. 정리하자면 1. @QueryHint 의 readOnly 속성은 (how) 스냅샷을 만들지 않음으로써 (what) Dirty Checking의 비교를 하기 위해 내부적으로 객체를 2개(스냅샷) 만들어 메모리 낭비하는 것을 방지 2. @Transaction(readOnly=true) 속성은 (how) DB에 반영할 것이 없다는 것을 암시하여 영속성 context flush 를 하지 않도록 하여 (what) dirty checking 안 함 -> 성능 최적화 으로 이해를 했는데요. 왠지 두가지 방법이 매우 유사한 것 같아 이와 관련하여 구글링 하던 중 https://vladmihalcea.com/spring-read-only-transaction-hibernate-optimization/ 위 글을 봤는데 제가 이해하기로는 위 글에서 얘기하는 Entity loaded state 가 말씀하신 스냅샷이고 강의와 동일하게 'queryHint-readOnly를 통해 생성을 막을 수 있다.' 라고 하면서 작성자 본인이 기존에 Transactional-readOnly를 사용했을 때 Entity loaded state(스냅샷) 생성이 막히지 않아 git pull 요청을 해서 spring 5.1에서 적용됐다는 것 같은데요. 제가 이해한게 맞는지 그렇다면 @Transaction(readOnly=true)를 @QueryHint-readOnly속성과 동일한 기능으로 보고 대체하여 사용할 수 있는지 궁금합니다. 감사합니다.
-
해결됨실전! 스프링 데이터 JPA
Spring jpa repository
안녕하세요 이번강의도 정말 잘듣고 있습니다. 다만 궁금한 점이 있다면..스프링 JpaRepository를 쓰면 jpa에 종속적인 repository가 만들어지지 않을까요? 원래 repository 패턴을 장점중 하나가 (캐쉬,api,nosql)등 구체적인 데이터 소스에 대한 의존성을 줄이기 위함이라 알고 있는데.. 실무에서는 사실상 적용하기는 개발공수에 비해 얻는 이점이 크지 않는건가요? 실무에서 그럼보통 nosql로 변경되거나 api로 변경되면(거의 없겠지만) 거의 대부분을 다시 작업하나요? 그리고 혹시 jpql사용시 join 과 fetch join의 차이점은 select 할때 받아오는 컬럼에만 차이가 있는건가요?
-
미해결실전! 스프링 데이터 JPA
도메인 락 관련 질문
위와같이 Order와 Product Entity가 N:M매핑일 때 1.Order에 대해서 락을 걸고싶은데 이럴경우 OrderItem에 관해서도 락을 걸어주는게 맞는지 궁금합니다 ㅠㅠ OrderItem까지 락을 걸어버리면 컬렉션에 값이 추가될때마다 업데이트 쿼리가 계속 늘어나가지고 성능적으로 문제가 생길거같아서.. 2.애그리거트 단위로 락을 걸어주는게 좋은건가요 ??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional 안에서 @Transactional 메서드 사용
선생님 안녕하세요. OSIV 수업을 듣다가 궁금한 점이 생겼습니다. @Transactional이 선언되어있는 메서드 내에서 @Transactional이 붙어있는 메서드를 호출하면 영속성 컨텍스트는 공유 되나요? 아니면 두 개의 영속성 컨텍스트가 생성되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성자에 static 제어자를 쓰는 이유가 있나요?
public static OrderItem createOrderItem(...){ // ... } 1. 제목과 동일합니다. 저 같은 경우엔 @Builder를 사용하긴 하는데 빌더패턴보다 더 선호되는 방식인가요? 2. 또한 생성자명을 따로 정하는 이유가 있을까요? 뭔가 의도는 알 거 같기도 한데, 제 추측 말고 정확한 이유가 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Generic 명시를 해야 하나요? 말아야 하나요?
강의 소스 코드 일부를 발췌했습니다. @GetMapping("/api/v2/members") public Result membersV2() { List<Member> findMembers = memberService.findMembers(); //엔티티 -> DTO 변환 List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName())) .collect(Collectors.toList()); return new Result(collect); } @Data @AllArgsConstructor class Result<T> { private T data; } -질문- DTO를 Result<T>로 만들었을 때, - public Result<MemberDto> membersV2() - public Result membersV2() 둘 중에 어떻게 작성하는게 더 좋은지 알 수 있을까요? 항상 타입을 명시하는 Result<MemberDto> 방식으로 사용해왔는데, 선생님 코드에는 뭐든지 이유가 있을 것 같아 이렇게 여쭤봅니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
inner static class 의 private 메소드에서 발생하는 EntityManager null exception
안녕하세요? 좋은 강의 감사합니다. 예제 코드를 따라 하던 중 내부 클래스 static class InitService 의 dbInit2() 메소드를 private 으로 바꿔보았는데 EntityManager 가 null 예외가 발생하더라구요 이유가 궁금하여 질문 드립니다. 감사합니다. @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void dbInit1() { Member member = createMember("userA", new Address("서울", "1", "1111")); em.persist(member); } private void dbInit2() { // InitDB 클래스의 내부 스태틱 클래스 InitService 안에 선언된 private 메소드 Member member = createMember("userB", new Address("진주", "2", "2222")); em.persist(member); // EntityManager null exception }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter를 builder 패턴으로 교체하는 데 질문이 있습니다.
상속관계에서 빌더 패턴을 사용하려다 보니 어떻게 짜야 가장 효율적이고 선호되는 방식인지 궁금합니다. 일단 저는 다음과 같이 짰습니다. 혹시 이런 문제와 관련해서 참고할만한 레퍼런스가 있을까요?
-
미해결실전! Querydsl
상속관계 Entity간 조인
안녕하세요. 고객 테이블을 상속관계를 이용하여 아래와 같이 설계를 하였습니다.(개인고객, 법인고객) @Entity@Getter @Setter@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name = "CUSTOMER_TYPE")public abstract class Customer extends BaseEntity { @Id @GeneratedValue @Column(name = "CUSTOMER_ID") private Long id; private String name; @Embedded private Address address; private int lineCount; @Column(name = "CUSTOMER_TYPE", insertable = false, updatable = false) private String customerType;} @Entity@Getter @Setter@DiscriminatorValue("COMPANY")public class CompanyCustomer extends Customer{ private String vatCode; private String owner; private String companyPhone;} @Entity@Getter @Setter@DiscriminatorValue("PERSON")public class PersonalCustomer extends Customer { private String jumin; private String handPhone;} 그리고 고객을 위한 DTO도 생성을 했습니다. @Datapublic class CustomerDto { @QueryProjection public CustomerDto(Long id, String name, int lineCount, Address address, String customerType, String jumin, String handPhone, String vatCode, String owner, String companyPhone) { this.id = id; this.name = name; this.lineCount = lineCount; this.address = address; this.customerType = customerType; this.jumin = jumin; this.handPhone = handPhone; this.vatCode = vatCode; this.owner = owner; this.companyPhone = companyPhone; } private Long id; private String name; private int lineCount; private Address address; private String customerType; private String jumin; private String handPhone; private String vatCode; private String owner; private String companyPhone;} 위 상태에서 querydsl를 이용해서 DTO에 Data를 넣기 위해서는 querydsl을 어떻게 생성해야 할꺄요? 실제로 sql query는 select customer0_.customer_id as customer2_2_, customer0_.crt_dt as crt_dt3_2_, customer0_.updt_dt as updt_dt4_2_, customer0_.city as city5_2_, customer0_.street as street6_2_, customer0_.zipcode as zipcode7_2_, customer0_.customer_type as customer1_2_, customer0_.line_count as line_cou8_2_, customer0_.name as name9_2_, customer0_.company_phone as company10_2_, customer0_.owner as owner11_2_, customer0_.vat_code as vat_cod12_2_, customer0_.hand_phone as hand_ph13_2_, customer0_.jumin as jumin14_2_ from customer customer0_ 위와 같이 발생하는 방법으로 알고 싶습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
궁금합니다.
안녕하세요 진짜 좋은 강의와 선생님의 답변으로 많이 배우고 있습니다. 강의를 따라 하다보니 몇가지 궁금증이 생겼습니다. 1. controller에서 responseEntity 를 안쓰시던데 딱히 이유가 있을까요? 2.계층끼리의 의존성을 낮쳐주기 위해서 dto를 저는 계층끼리 통신할때 쓴다고 알고있었고 entity 가 business layer인 서비스 계층을 벗어나면 좋지않다고 알고있었습니다. 그래서 service에서 controller 로 넘겨줄때 항상 entity를 dto로 만들어서 넘겨주는 방식으로 사용했습니다. 하지만 선생님은 service 계층에서는 controller에 값을 넘겨주지 않거나 id 정도만 넘겨주고 controller 에서 다시조회 하던지 해서 그값으로 resposne dto를 만들어주는 방식으로 하셨습니다. 제가 기존에 하던 방식은 잘못된건가요? 3.OrderSimpleApiController 같은경우는 orderSerivce를 전혀 사용하지 않았더라구요 대부분의 조회가 바로 OrderRepository에서 가능한 부분이었지만 이렇게 바로 가능하면 서비스 계층을 안통하고 하는방식이 나은건가요? 혹시 언제는 단순 위임이라도 서비스 계층을 통해 repository를 사용하는게 좋고 언제는 바로 조회하는게 좋은지 궁금합니다.