묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 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 개발과 성능 최적화
Connection pool
선생님 안녕하세요. 수업내용과 무관하지만, 한 가지만 더 여쭤보겠습니다..! 실무에서 커넥션 풀의 개수는 어떤 근거로 결정하나요?? 커넥션 풀을 많이 만들면 어떤 단점이 있는지도 알려주시면 감사하겠습니다..!
-
미해결실전! 스프링 부트와 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를 사용하는게 좋고 언제는 바로 조회하는게 좋은지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상속구조 타입캐스팅, update form 질문드립니다.
웹 계층 개발, 상품 수정 강의 수강중 질문드립니다. 1. createItemForm 과 updateItemForm 이 많은 차이가 나지 않는 것 같은데 따로 생성한 이유가 있을 까요? controller 와 매핑되는 화면이 하나인 것이 좋은 설계라던가 그런 이유가 있을 지 궁금합니다. 따로 만들면 나중에 필드의 항목이 추가 되거나 하면 변경해줘야 할 화면이 늘어나는 것 같아서요 2. 상속 관계로 매핑된 item 캐스팅의 대안 item의 경우 서비스에서 조회한 객체를 캐스팅하여 써야하는데 설명 중에 캐스팅하는 것이 좋은 방법이 아니라고 하셨는데요 Book book = (Book) itemService.findOne(itemId); 다른 대안이 어떤 것이 있을까요? 캐스팅이라고 하시니 제너릭이 생각나는데 이것이 대안이 될 수 있을 까요? 강의 잘 보고 있습니다. 감사합니다. :)
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
제가 이해한 것이 정확한지 궁금합니다.
1. 이렇게 표로 정리된 내용이 맞나요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
7분18초 내용 질문있습니다.
7분18초에 팀에서 멤버들을 List로 출력할때 위에서, em.flush()랑 em.clear()를 사용해야만 쿼리가 DB로 보내지고 @OneToMany(mappedBy = "team") 애노테이션 때문에 , members 리스트에 멤버객체가 저장되는건가요 ?? em.flush()랑 em.clear()를 사용하는 이유가 헷갈립니다. 플러쉬랑 클리어를 안해주니 팀에서 members 가 비어있더라구요.. 천천히 듣고있지만 이해가 안되서 여쭤봅니다 ㅜ.ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa create 및 update 시 dto에서 entity 변환방식
안녕하세요 정말 유익한 강의 잘듣고 있고요 항상 친절한 답변에 감사함을 느낍니다. 1.create시 createDto로 서비스로 넘어 온다면 아래에 방법중 어떤게 유지보수와 같은 측면에서 가장 나은 선택인가요? a. model mapper 나 mapstruct 라이브러리로 매핑한다. b. 서비스 계층에서 엔티티 빌더로 dto 값을 하나하나 세팅한다. c. 엔티티 생성자나 빌더에 dto 를 넘기고 그안에서 값을 세팅한다. 2.update시 updateDto로 서비스로 넘어 온다면 아래에 방법중 어떤게 유지보수와 같은 측면에서 가장 나은 선택인가요? a.강의에서 처럼 dto 값을빼서 전달한다. entity.change(updateDto.getA(),updateDto.getB()) b. 전체 Dto를 넘긴다. entity.change(updateDto) 3. update patch시에는 변경하지 않는값은 updateDto에 널로 들어온다면 모든 값을 하나씩 체크하면서 null 이 아닌것에대한 엔티티를 업데이트 해주는 방식이 최선인가요? 4.만약 엔티티에서 dto 로 변환시에는 보통 어떤 방식으로 실무에서 많이 하나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
시퀀스 방식에서 질문드립니다
시퀀스 방식에서 next value 50개를 먼저 가져오면 그 뒤에 실행되는 것들은 51번부터 시작한다고 하셨는데, 그러면 51번 시퀀스가 2, 3.. 50번 시퀀스보다 먼저 생성될 수 있게 되는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
UI 계층에서 Entity Object 생성 질문
영상에서 UI 계층 (Controller)에서 Member Entity Object를 생성해서 파라미터로 넘겨주어 Service 계층에서 회원가입 처리를 하도록 코딩을 하셨는데,원래 UI계층에서 Entity Object를 생성해서 Service 계층에서는 응용서비스 관련 로직만 짜는게 맞는건가요?아니면 앞 영상에서 말씀하셨던, 너무 "Controller -> service -> Repository 로만 구조를 가져가려면 딱딱하고 불편한 점이 있다,"라는 말씀을 하셨던 부분에 해당해서 다르게 코딩하신 건가요?
-
미해결실전! Querydsl
From절 SubQuery 문의
영한님 안녕하세요. JPQL 의 경우, From 절 내에서 SubQuery 를 지원하지 않으므로 Join 을 좀 더 활용하거나 또는 쿼리를 여러 개로 분해해서 첫번째 결과를 다음 쿼리의 파라미터에 넣어주는 방식으로 활용할 것을 권장해 주셨는데요. 혹시 From 절 내의 SubQuery 를 하나의 Query 로 뽑아낸 후, 결과 List 를 두번째 쿼리 안으로 집어 넣을 수도 있는 건가요? 다음 쿼리의 파라미터에 넣는다는 의미가 이러한 List 형태로 활용을 할 수 있는 것인지 좀 궁금합니다. 일부 강사님들 보면 보충이 필요하다고 생각되는 내용이 생기면 짧막하게 추가 영상도 넣어주시는 분들이 있던데 제 개인적으로는 From 절 내의 SubQuery 를 해결하는 예제를 하나 보여주시면 많은 분들에게 도움이 되지 않을까 생각이 듭니다. 실무에서 JPA 를 쓰기 전에 From 절 SubQuery 는 MyBatis 에서 워낙 많이 사용되던 용법이다보니 JPA 전환 과정에서 이 부분을 막연해 하는 개발자들을 많이 보이는 것 같습니다.
-
해결됨실전! Querydsl
동적쿼리 where절 파라미터 조합 질문입니다.
private BooleanBuilder ageCond(Integer ageGoe, Integer ageLoe) { BooleanBuilder booleanBuilder = new BooleanBuilder(); return booleanBuilder .and(ageGoe(ageGoe)) .and(ageLoe(ageLoe)) .and(teamNameEq("teamB"));}private BooleanExpression usernameEq(String username) { return isEmpty(username) ? null : member.username.eq(username);}private BooleanExpression teamNameEq(String teamName) { return isEmpty(teamName) ? null : team.name.eq(teamName);}private BooleanExpression ageGoe(Integer ageGoe) { return ageGoe == null ? null : member.age.goe(ageGoe);}private BooleanExpression ageLoe(Integer ageLoe) { return ageLoe == null ? null : member.age.loe(ageLoe);} ageCond 처럼 여러 조건 조합시 null처리를 조금 이쁘게 하고 싶은데 다른 생각이 안나서 booleanBuilder로 해봤더니 별 문제는 없는데요, 혹시 다른 깔끔한 방법이 있을까요?