묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
클린 아키텍처에서 JPA
클린 아키텍처 (및 헥사고날) 설계 시 JPA 영속성 계층을 어디에 두어야하는지 궁금합니다.일반적으로 해당 아키텍처에선 영속성 계층을 도메인 계층에서 분리시켜야 한다고 주장하던데 (육각형 안 Entity는 POJO이며, JPA Entity는 바깥의 Adapter에 구현하고 Mapper로 변환하는 형식), 이렇게 되면 JPA가 제공하는 lazy loading이나dirty checking 등의 이점은 포기해야 되는것일까요?도메인 모델에 JPA 코드를 사용하자니 이러한 아키텍트 원칙에 위배되는거 같고, 그렇다고 이걸 분리해놓으면 따로 구현해야될게 많아지니 고민입니다..타협을 한다면 어느 방식으로 하는게 좋을까요? 애초에 이러한 아키텍트 방식과 JPA는 (지향점이 다르기에) 어울리지 않는 것일까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
초록색 주석문은 뭔가요 .. !
pdf 교안 보면 이런식으로 되어있는 초록색 주석문? 이 있던데그냥 인텔리제이에서는 // 나 /* */ 했을 때 회색으로만 표시되고 저렇게 초록색으로는 안 표시되더라구요 ... 저거는 뭔가요 ?생성 단축키도 알려주시면 감사하겠습니다 ...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join과 join fetch 의 차이 ..
OrderQueryRepository 에 findAllByDto_flat 보면다 join 으로 되어있는데 join과 join fetch (페치 조인)의 차이점은 뭔가요 ..?join도 lazy 로 되어있는거 한번에 끌고오는 건 비슷한 거 같은데 .. ㅜ
-
미해결
JPA Update 반영이 되지 않습니다.
안녕하세요! JPA를 사용해서 간단한 장바구니 프로젝트를 진행하고 있습니다.장바구니에 들어있는 아이템의 수량을 수정하는 테스트코드를 작성하고 있었습니다.수정할 장바구니아이템 자체는 수정이 되었지만, 장바구니에 들어있는 수정을 요청한 아이템은 수량이 반영되지 않았습니다.혹시 연관관계나 영속성 문제인가 싶어서 게시판<-> 댓글로 테스트코드를 짜보았는데, 게시판 <-> 댓글 테스트코드는 성공하였습니다. 혹시 어떤 문제인지 알 수 있을까요? 아래는 장바구니와 장바구니아이템 연관관계 입니다!@Entity @Table(name = "tbl_cart") public class Cart { @Id @Column(name = "cart_id", columnDefinition = "BINARY(16)") private final UUID id = UlidCreator.getMonotonicUlid().toUuid(); ... @OneToMany(mappedBy = "cart", fetch = FetchType.LAZY) private final List<CartItem> cartItems = new ArrayList<>(); protected Cart() { } private Cart(User user) { this.user = user; } public static Cart create(User user) { return new Cart(user); } public void addCartItem(CartItem cartItem) { cartItems.add(cartItem); } ... }@Entity @Table(name = "tbl_cart_item") public class CartItem { @Id @Column(name = "cart_item_id", columnDefinition = "BINARY(16)") private final UUID id = UlidCreator.getMonotonicUlid().toUuid(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cart_id") private Cart cart; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @Column(name = "amount") private int amount; protected CartItem() { } private CartItem(Cart cart, Item item, int amount) { this.cart = cart; this.item = item; this.amount = amount; } public static CartItem create(Cart cart, Item item, int amount) { return new CartItem(cart, item, amount); } ... } 아래는 장바구니아이템의 수량을 수정하는 로직입니다!@Transactional @Override public void updateCartItemAmount(UUID userId, CartCommand.UpdateCartItemAmount command) { User user = userRepository.getUser(userId); Cart cart = cartRepository.getCart(user); cart.validateHasSameUser(user); CartItem cartItem = cartItemRepository.getCartItem(command.cartItemId()); cartItem.updateAmount(command.amount()); } 아래는 실패한 테스트코드 입니다!@DisplayName("장바구니 아이템의 수량을 변경한다.") @Test void 장바구니_아이템의_수량을_변경한다() { //given cartService.addCartItem(user.getId(), CART_아이템_요청); //when Cart cart = cartRepository.findByUserId(user.getId()) .orElseThrow(CartNotFoundException::new); CartItem cartItem = cartItemRepository.findByCartAndItem(cart, item) .orElseThrow(CartItemNotFoundException::new); CartCommand.UpdateCartItemAmount CART_아이템_수량_변경_요청 = CartCommand.UpdateCartItemAmount.builder() .cartItemId(cartItem.getId()) .amount(3) .build(); cartService.updateCartItemAmount(user.getId(), CART_아이템_수량_변경_요청); Cart actual = cartRepository.findByUserId(user.getId()) .orElseThrow(CartNotFoundException::new); assertAll(() -> { assertThat(cartItem.getAmount()).isEqualTo(3); assertThat(actual.getCartItems().get(0).getAmount()).isEqualTo(3); }); }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복합키 다 대 일 단방향 연관관계 @ManyToOne @Fetch 설정 방법 문의 드립니다.
강사님 안녕하세요 ~ 아래 질문은 먼저드린 질문과 다른 질문입니다.아래 첨부이미지 확인해주세요 저는 ComCorpUser.bizCd / teamCd 와ComBizTeam 에 있는 복합키의CombizTeamPK 의 속에 있는 bizCd / teamCd 와@ManyToOne @Fetch 애노페이션 연결 고리를 걸어서다대일 단방향 연관관계를 맺고 싶습니다.ComCorpUser 클래스의 java 파일을 어떻게 만들어야 할까요?강사님이 직접 1개의 클래스 java 파일을 만들어서보여 주실 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
9분 05초 author이랑 isbn
author이랑 isbn이 null로 나와있는데 싱글테이블에서 Album이랑 Movie에 관련된 컬럼은 안나오고 딱 Book이랑만 관련된 author이랑 isbn 만 null로 표시됐는데 이건 JPA가 Book인 걸 알아서 그것만 표시해주는건가요 ?? 어떻게 author이랑 isbn만 표시해주게 되는건지 궁금합니다 ..
-
미해결실전! 스프링 데이터 JPA
Setter, Merge, InvalidDataAccessApiUsageException Error
안녕하세요. Setter를 사용하고 싶지 않아서 아예 Setter를 사용하지 않는 방향으로 코드를 작성중입니다.Member1의 이름을 Member 1에서 Updated Member로 바꾸기 위해서 setUsername 함수를 사용하지 않고, 처음에 Member1의 아이디를 그대로 받는 생성자를 만들어서 이름 빼고 모두 똑같이 맞춰주고 Save를 하면 될 줄 알고 코드를 이렇게 작성했는데InvalidDataAccessApiUsageException:detached entity passed to persist라는 에러를 얻게 됬습니다.newMember1이라는 객체에 따로 뭘 하지도 않았는데 Detached 상태라고 해서 조금 의아해서 찾아봤는데 이미 영속성 컨텍스트에 id가 1인 Member1이 있는 상태에서 갑자기 쌩뚱맞게 똑같은 Identifier를 가진 NewMember를 Persist하려고 하니 생긴 오류인걸 알게 됬습니다.그래서 Setter없이 하는 방법은 정말 없을까 하다가 해당 글을 발견하게 되었고, 아래 스샷과 같이 Comment를 참고 해서, 해당 Oracle Reference에서 Merge라는 Method를 알게되었고(조금 밑으로 스크롤을 내려야합니다.) 현재 영속성 컨텍스트에 매개변수로 받은 Entity의 상태를 Merge한다는 내용이 제가 원래 하려던 생각과 맞는것 같아생각과 비슷한 것 같아 사용해 보았습니다.이렇게 Merge를 사용한 테스트코드에서는 테스트가 통과되고, 실제 DB에도 Member1의 이름이 Updated Member로 변경이 되었습니다. (Update Query도 실제로 실행되는것을 확인할 수 있었습니다.)JPA가 변경 감지를 통해서 Update를 해준다는것과 그게 정석이라고 말씀해 주셨고, 그렇게 JPA의 변경 감지를 사용하는게 상태를 마치 값변수처럼 직접 변경하는것 보다 좋을 것 같습니다.하지만 change~ 함수나 아래와 같이 다른 Setter를 대신하겠다고 만든 여러 함수들에서 이름만 set이 안들어갔지 결국 그 함수의 내용은 Setter랑 다를바가 없는데 이게 Setter를 사용하는것과 무슨 차이가 있는지 잘 모르겠습니다. Lombok의 @Setter를 사용해서 단지 모든 프로퍼티에 대해서 Setter를 만들어주지않고 개발자가 직접 지정한 부분만 Setter를 만들어 줄 수 있다는 측면에서는 차이가 있는것 같습니다.또한 제가 이렇게 Merge를 사용해서 Update를 하는게 확실히 다른 개발자 분들이 잘 사용하지 않은 방법인것 같긴합니다. 혹시 이렇게 Merge를 사용하는것에 대해서 어떠한 의견을 가지고 계신지 궁금합니다!감사합니다 :D
-
미해결실전! 스프링 데이터 JPA
Production에서의 p6spy의 보안문제는 생기지 않을까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요. Production에서 p6spy의 사용에 대한 질문 드립니다. 성능을 고려해봐야한다고 말씀해주셨는데, 그것에 더해 p6spy에 의해 출력된 데이터가 만약 상당히 민감한 정보(비밀번호, 개인정보)를 출력하게 된다면 보안상 이슈도 고려를 해야하지 않을까라는 생각이 듭니다! 혹시 이 부분에 대해서 어떤 의견을 가지고 계신지 여쭤보고 싶습니다! 감사합니다 :D
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
실전 강좌 내용중에 로그인,로그아웃 구현 관련 항목이 있나요?
실전 강좌 내용중에 로그인,로그아웃 구현 관련 항목이 있나요?항목을 뒤져보는데 저는 안보여서 혹시 제가 몰라서 그런지 확인차 문의드립니다 감사합니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티 설계 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의내용을 듣고 엔티티 설계중입니다.상품, 게시판, 문의게시판 등에서 공통으로 사용할 Image엔티티를 만드려고 합니다.이미지 테이블의 FK는 상품,게시판,문의게시판의 PK가 되게 만드려고 합니다.여기서 강의대로 상품,게시판,문의게시판의 PK를 시퀀스로 하게 되면 이미지테이블입장에서 FK가 가르키는게 상품인지, 게시판인지 모르는 문제가 발생합니다. 이럴때 실무에서는 상품,게시판 등의 PK에 prefix값을 넣어주나요? 아니면 시퀀스로 만들고, 이미지테이블에 구분값을 만들어주나요? 아니면 아예 다른 구조로 풀어내는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복합키 있는 테이블 조인시 방법 문의 드립니다.
안녕하세요 강사님~ 아래와 같은 엔티티가 있다고 가정 할 때 유저정보(ComCorpUser) 조회 시 연관관계를 이용해서 유저정보에 연결된 업체코드(BIZ_CD) 조인조건을 걸어서업체팀코드(ComBizTeam) 를 가져오려고 합니다 --█●●--------------------------------------------COM_CORP_USER (유저정보)ComCorpUser 클래스 USR_ID 유저아이디 BIZ_CD 업체코드 TEAM_CD 팀코드--█●●--------------------------------------------COM_BIZ_TEAM (업체별팀정보)ComBizTeam @EmbeddedId private ComBizTeamPK id;//=>아래 ComBizTeamPK 복합키 사용 BIZ_CD 업체코드 TEAM_CD 팀코드 TEAM_NM 팀명 --█●●--------------------------------------------COM_BIZ_TEAM (업체별팀정보) 복합키@Embeddablepublic class ComBizTeamPK BIZ_CD TEAM_CD TEAM_NM --█●●--------------------------------------------//사용자정보public class ComCorpUser { private static final long serialVersionUID = 1L; @Column(name="BIZ_CD") private String bizCd; @Fetch(FetchMode.JOIN) @ManyToOne @NotFound(action = NotFoundAction.IGNORE) @JoinColumn( name="BIZ_CD" , referencedColumnName ="ID.BIZ_CD" , insertable=false, updatable=false) private ComBizTeam comBizTeamInfo; @Column(name = "TEAM_CD") private String teamCd; //업체별팀코드 public class ComBizTeam { private static final long serialVersionUID = 1L; @EmbeddedId private ComBizTeamPK id; //업체별팀코드 복합키 public class ComBizTeamPK implements Serializable{ private static final long serialVersionUID = 1L; @Column(name="BIZ_CD") private String bizCd; @Column(name="TEAM_CD") private String teamCd; --█●●-------------------------------------------- JPA 사용시 특정 유저 테이블과 코드성 업체팀코드 테이블 과 조인 조회 시에 @EmbeddedId 복합키와 조인을 하려고 합니다.구글도 찾아보고, 제가 생각했던 대로 표현을 하면 에러가 발생하네요 @JoinColumn 부분 테스트 1. referencedColumnName ="id.BIZ_CD" => 서버재시작시에러 Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to find column with logical name: id.BIZ_CD in org.hibernate.mapping.Table(COM_BIZ_TEAM) and its related supertables and secondary tables 테스트 2. referencedColumnName ="ID.BIZ_CD" => 서버재시작시에러 Unable to find column with logical name: ID.BIZ_CD in org.hibernate.mapping.Table(COM_BIZ_TEAM) and its related supertables and secondary tables 테스트 3. referencedColumnName ="BIZ_CD" => 서버재시작시에러 referencedColumnNames(BIZ_CD) of ComCorpUser.comBizTeamInfo referencing ComBizTeam not mapped to a single property 질문1.복합키 조인시 뭔가 방법이 있을거 같은데 제가 어떻게 변경해야 하는지 가르침 부탁드립니다. 질문2.혹시, 김영한 강사님이 JPA 공부를 위해서 자주 참조 하시는 JPA 관련 해외 잘되어 있는 레퍼런스 사이트나, 좋은 블로그가 있다면 수강생들을 위해 공유 부탁드립니다. (막힐때 마다 구글링/블로그 뒤지기 전에 만약 알려주시면 그부분에서 먼저 찾아보거나 더 공부 하려고 합니다) 감사합니다. 수고하세요 #테이블#조인#table#join#JoinColumn#EmbeddedId #join#컬럼#여러개#multiple#column#JPA
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션 1 프로젝트 환경설정 - JPA와 DB 설정, 동작확인 부분 오류
프로젝트 환경설정 섹션에서 JPA와 DB설정, 동작확인 강의에서 오류가 납니다. 위 사진에서 SpringRunner 부분이 노란색으로 안칠해져 있어서 JUnit4가 제대로 설정이 안됐나 싶어서 강의 자료와 똑같이 타이핑 했는데 위 사진처럼 useJUnintPlatform부분이 회색으로 비활성화가 되어있습니다. 이거 때문에 오류가 나는거 인가 싶습니다. 오류 메세지를 확인해보니 JUnit4 추가 부분을 코드에 추가하던 안하던 똑같은 오류가 생기는거 보니까 저 회색이 문제인거 같은데 어떻게 해결해야할지 모르겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
궁금한 점이 생겨 질문 남겨봅니다.
자바 서비스로직의 트랜잭션내에서 오류가 발생하면 롤백이 될건데, 그러한 오류사항을 DB에 어떻게 로그로 남길 수 있는지 알 수 있을까요???
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
지연 로딩(+ 변경감지..?) 에 대해 질문 드립니다.
지연 로딩으로 인한 프록시 객체는 실제 사용 시에 쿼리가 나가는 것으로 생각했으나,생각과 달리 동작하여 질문을 드립니다.> followers, followings는 LAZY로 설정되어 있습니다.this.followings.add() 호출 시점에 Lazy Loading이 수행되어 쿼리가 나갈 것으로 예상했으나, 다음과 같은 출력입니다. getFollowers().size() 호출 시에야 실제 쿼리가 나가는 것으로 보입니다. 필드에 getter가 아닌 직접 접근이 문제였는지 테스트 해보았는데, 직접 액세스 시에도 초기화는 진행되는 것으로 확인됐습니다. 추측가는 바는...Q1. 혹시 컬렉션의 메소드별(add() , size())로 초기화가 진행되고 아니고 차이가 있을까요?Q2. 위 경우, 아무튼 메모리 상 컬렉션에만 객체를 저장한 상태가 됐습니다. 근데, size() 호출 시에 DB에서 끌어온 컬렉션과, 메모리에 올라간 1개가 합쳐진 개수가 잘 합쳐진 것 같습니다. followers 같은 경우 엔티티에 스냅샷도 없어야 할 상황인 것 같은데, 작동 원리가 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpa설정하는데 자꾸 Socket faul to connct to host라고 나옵니다.
안녕하세요항상 강의 잘보고 있습니다.수업내용은 아니지만 혹시나 해서 여쭤봅니다. 다름이 아니라 본 과정에서 jpa에 대해 배우고 토이프로젝트에서 ec2위 도커에서 mariaDB를 띄워 워크벤치에서 접속 되는것을 확인하고 jpa에서 설정정보를 기입을 하였습니다. 그러나 인텔리제이에서 tomcat을 띄우니까 다음과 같이 오류가 나오네요..어떤것 때문인지 한번 봐주실수 있나요?컨테이너 포트는 3306 -> 3306으로 설정해놓았으며ec2인스턴스, 컨테이너의 방화벽 모두 0.0.0.0/0으로 열어놓았습니다.언어: 자바17스프링부트: 3.0.5DB: mariadb 10.7mariadb connector : 3.0.10dialect: org.hibernate.dialect.MariaDB103Dialect추가로 혹시나 하여 프로젝트 파일을 압축해서 링크 걸어놓겠습니다. https://drive.google.com/file/d/1enCUJr78tuccks2Pv9Dn8vabr_lQySuA/view?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JpashopApplicationTests 삭제해버렸는데...
JpashopApplicationTests 클래스를 삭제해서 지금 Test 코드를 못 돌리고 있습니다. 혹시 이 안에 코드가 어떻게 되어있는지 알 수 있을까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
학습적인 질문보다는 저작권에 대해서 문의 드립니다.
안녕하세요. 제가 개인 프로젝트를 준비하고 있는 와중에 JPA를 도입 하면서 현재 강의를 수강하게 되었습니다.개인프로젝트를 만들면서 기술블로그 카테고리를 만들 예정입니다. 여기에는 개인프로젝트를 진행하면서 발생하는 이슈나 혹은 기초 지식부터 공부한 내용을 정리하는 블로그로 현재는 생각 하고 있습니다.기술 블로그 내용에는 김영한 프로님의 시청 중인 강의 내용과 프로님의 책을 참고하여 적어보고 싶습니다만 출처는 분명 밝히겠지만 이렇게 여쭤보지 않고 블로그를 작성 한다는 것이 프로님 포함하여 강의를 준비하신 노력과 책을 써주신 분들을 무시하는 것 같습니다. 더 나아가 노력 해주신 많은 분들이 기분이 나쁠수 있겠다 싶어 당황스럽고 진부 하실지는 모르겠으나, 혹시 허락을 여쭤보자 이렇게 질의 응답에 문의 드립니다.만일 이에 조금이라도 불편하신 부분이 있다면 더는 여쭤보지 않겠습니다.답변 부탁드리겠습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
오타 제보합니다!
ver.23-01-03상품 서비스 개발 부분(48p)에 상품 서비즈 코드 -> 상품 서비스 코드 오타가있습니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드 오류
12:34 테스트가 통과해야하는데 오류가 나고 못찾겠어요오류 메시지를 보면 <jpabook.jpashop.exception.NotEnoughStockException> 를 기대했지만<org.springframework.dao.InvalidDataAccessApiUsageException>이 나왔는데 디버그를 돌려보니까이 줄에서 멈춥니다. itemId가 null인게 문제일까요??근데 희안한건 상품주문 테스트는 또 통과가 됩니다 ㅠㅠ
-
미해결실전! Querydsl
안녕하세요 프로젝트 실행 문의 드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]영한쌤 강의를 쭉 따라서 들어왔는데요. 그동안의프로젝트와는 다르게 왜 이번 querydsl 편은 프로젝트 생성후 실행시 그냥 폴더 자체를 선택하는게 아니라 build.gradle 파일을 선택후 오픈해야 하나요?? 또 그렇게 build.gradle 파일 한개만 선택해서 오픈했는데 일반 프로젝트 폴더를 여는것처럼 main부터 test및 다른 파일 모두가 있는건가용??? 그리고 왜 querydsl폴더 자체를 선택후 열면 파일구조는 모두 똑같은데 활성화가 안되는지 궁금합니다