묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 데이터 JPA
같은 테이블의 외래키와 복합키
안녕하세요 영한님. 항상 강의 잘 듣고있습니다.회사에서 레거시 코드를 엔티티로 변경하다보니 궁금한게 있어 문의드립니다.첫번째 질문혹시 복합키가 3개의 컬럼으로 되어있을 때, 2개의 컬럼이 같은 테이블과 매핑해야 된다면 어떻게 해줘야하는지 알 수 있을까요? @EmbeddedId, @IdClass 둘 다 필드명으로 매핑을 해줘야 하는데, 한 필드밖에 매핑이 안되서 여쭤봅니다.두번째 질문아래 키들이 전부 Enum으로 되어있다면 조인할 때 @Enumrated(STRING) 이 적용이 안되는 것 같은데 어떻게 하면 좋을지 여쭤봅니다.예를 들어,A의 복합키 [a, b, c] 중 [a, b]가 B와 매핑되는 외래키이고, [c]는 C와 매핑되는 외래키입니다.* 여기서 B의 a, b는 B의 PK입니다.* A와 B는 일대다, A와 C 또한 일대다 관계입니다.class A { @Id @Enumerated(STRING) EnumType a; @Id @Enumerated(STRING) EnumType b; @Id @Enumerated(STRING) EnumType c; } class B { @Id @Enumerated(STRING) EnumType a; @Id @Enumerated(STRING) EnumType b; } class C { @Id @Enumerated(STRING) EnumType c; }@EmbeddedId 사용시@Embeddable public class AId implements Serializable { private BId b; @Enumerated(STRING) private EnumType c; } @Embeddable public class BId implements Serializable { @Enumerated(STRING) private EnumType a; @Enumerated(STRING) private EnumType b; } @Entity public class A { @EmbeddedId private AId id; // 쿼리에서 EnumType의 숫자값이 들어갑니다. @ManyToOne(fetch = LAZY) @JoinColumns(value = { @JoinColumn(name = "a"), @JoinColumn(name = "b") }) private B b; }
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 PPT 자료는 어디서 다운받을수 있나요?
안녕하세요.강의 PPT 자료를 찾아봤는데 없어서 문의드립니다. 현재 다운받을수 없는건가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시와 연관관계 관리 - orphanRemovel 관련 질문
안녕하세요.[프록시와 연관관계 관리 - orphanRemovel] 내용에서 질문드립니다.orphanRemovel = false, cascade = ALL 로 설정한 상태에서 @OneToMany로 설정된 컬렉션 내의 값을 제거하면, cascade 옵션에 의해 update 쿼리가 나갈 때 컬렉션에서 제거된 원소가 같이 삭제되어야 하는게 아닌가요?위 내용이 틀렸다면 cascade의 delete 쿼리는 부모 엔티티 '자체'가 사라졌을 때만 컬렉션 내의 자식 엔티티들에게 전이되는 걸까요??추가로, 고아 객체 제거 기능은 cascade와 마찬가지로, 연관관계의 주인이 아닌 컬럼에서도 사용이 가능한건지도 궁금합니다!내용이 잘 이해되질 않아 질문이 다소 두서없는 점 죄송합니다ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@PostMapping으로 등록 시 파라미터 안에 List 질문입니다.
안녕하세요강의 완강 후 따로 프로젝트를 만들어 보던 중 궁금한 게 생겨서 질문 드립니다. PostMapping으로 등록할 때 CreateRequest라는 별도의 클래스를 만들어 주어서 파라미터로 받았는데 이 CreateRequest안에 List를 받아야 할 경우가 있다면 어떻게 해줘야 하는지 잘 모르겠습니다. Product 클래스 입니다.Module 클래스 입니다.하나의 Product에 여러 개의 Module이 들어갈 수 있기 때문에ProductModule 클래스를 만들어줬습니다.이러한 경우에서Product를 등록할 때아래와 같이 넘겨주고 싶으면CreateProductRequest 에서 List를 어떤식으로 받아줘야 하나요? 아래와 같이 해봤는데 잘 안되는 것 같아서요...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
entity로 의존관계가 들어와야하는데 반대로 의존관계가 나가버린다
회원조회api 영상의 5:40초쯤 하신 말씀입니다.근데 이 말이 무슨말인지 잘 모르겠어요왜 의존관계가 나간다고 표현하시는 거죠?json으로 출력할때만 출력하지 않는것이 왜 의존관계가 나가는일인건가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
CQS
관련 질문에 대한 답변을 읽어봤는데도 이해가 가지 않아서 질문드립니다.커맨드와 쿼리를 분리해야한다는 CQS를 설명하신 말이었어요. 내부변경이 일어나는것은 커맨드, 명령어라고 부른다커맨드는 결과값을 그대로 반환하면안된다내부변경이 일어나지않는 것은 쿼리라고 부른다.쿼리는 결과값을 반환한다-> 1. 커맨드에서 결과값을 반환하면 안되는 이유가 뭘까요?update 메서드 안에서도 결국은 update하는것(커맨드)과 findOne(쿼리)하는 코드가 모두 들어가있는거잖아요? 근데 이게 왜 cqs를 지킨 사례인거죠?@Transactinalpublic vodi update(Long id, String name){ memberService.update(id,name); Member member = memberService.findOne(id); rreturn ~~~;}
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
memberUpdateDto가 필요한 이유
강의도중에 설명해주시긴 했는데 그래도 이해가 덜 가서 질문드립니다membersaveDto만있으면 memberupdatedto를 만들지 않아도돼요둘다 만들게 되면 코드의 중복이 발생하는것아닌가요?save와 update는 아예다른것이기때문에 중복이 발생해도 상관이 없는걸까요?아예다른것이라기엔 update에도 있고 save에도 있는 필드에 변화가 생겼을때 둘다 수정을 해주어야해요그럼 수정해야할 포인트가 늘어나는건데도 updateDto를 생성해주는게 맞는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실제 개발 시 테스트 서버/DB 구성 방식 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서는 개발과 테스트 코드가 모두 동일한 h2 DB 기반으로 구현이 되는데 실무에서는 테스트 코드에 대한 DB 연결을 어떤식으로 하게되는지 궁금합니다. 예를 들어 실제 개발은 A 서버의 mysql 을 사용하고 테스트는 로컬의 h2 로 별도로 연결을 하는지,아니면 동일한 서버(환경)에서 테스트용 테이블들만 별도로 만들어서 하는지,또는 모든 환경을 동일하게 하고 테스트 코드만 인메모리에서 실행되게 하는지, 실제 개발 시에는 테스트 코드에 대한 서버, DB 구성 방법이 궁금합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
주 테이블에 외래 키 단점
안녕하세요!일대일매핑을 '주 테이블에 외래 키'로 사용했을 때 단점이 값이 없으면 외래 키에 null을 허용하는 것이라고 되어있는데 이 부분 잘 이해가 되지 않아서요ㅜㅜ'대상 테이블에 외래 키' 방식으로 일대일 매핑을 하더라도 결국 대상 테이블 입장에서는 값이 없으면 null이 들어가는 건 마찬가지 아닌가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
유효성 검증 위치 관련 질문
안녕하세요. 로드맵 수강하고 토이 프로젝트 진행 중인데 궁금한 점이 계속 나오네요..일반적으로 사용하는 표현 - 비즈니스 - 도메인 계층 구조에서 비즈니스 정책을 검증하는 위치와 관련해서 질문 드립니다.예를 들어 사용자용 게시글 삭제 API는 현재 요청 사용자가 게시글의 작성자가 맞는지 검사합니다. 이 검증 작업을 서비스 계층에서 처리했습니다.public class PostService { private final PostRepository postRepository; // 게시글 삭제 기능 public void deletePost(Long postId, Long currentMemberId) { // 엔티티 조회 후 게시글 작성자가 현재 요청 사용자( currentMemberId )와 일치하는지 검사 Post post = postRepository.findById(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } post.delete(); } }이 메서드를 사용자 API 컨트롤러에서는 잘 사용했는데, 관리자 API는 게시글 작성자 검증이 필요 없다는게 문제였습니다. 사용자 및 관리자용 API 컨트롤러에서 호출하는 것은 결국 '게시글 삭제'라는 동일한 기능이므로 하나의 서비스 클래스에서 제공하는 게 맞다 판단하여 deletePost() 메서드에서 수행하던 유효성 검증 로직을 사용자 API 컨트롤러로 이관했습니다.public class PostController { private final PostService postService; // 실제 코드는 아니며 설명용 코드입니다. // 예를 들어 currentMemberId의 경우 실제론 @AuthenticationPrincipal 등을 통해 얻습니다. @DeleteMapping("/{postId}") public void delete(Long currentMemberId, @PathVariable Long postId) { Post post = postService.findPost(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } postService.deletePost(postId); } }이렇게 구성하니 PostService를 사용자 API 컨트롤러에서도, 관리자 API 컨트롤러에서도 사용 가능했지만.. 표현 계층에서 비즈니스 정책을 검증하니 구조가 이상한 것 같아서 질문 드립니다.'게시글을 삭제하려는 사용자가 게시글의 작성자인가?'를 확인하는 작업은 비즈니스 정책에 의한 작업이라 생각합니다. 그러므로 서비스 계층에서 검사하는 게 맞다 생각되는데, 관리자 API에서 사용하기 불편하더라구요. 이런 경우 구조를 어떻게 가져가시나요?PostService는 비즈니스 로직만 처리하고, PostUserService 같은 래퍼 서비스를 만들어 검증 부분을 처리할까 했는데, 썩.. 맘에 들진 않았습니다.예시처럼 정책 검증을 컨트롤러에서 수행한다 가정하면, 제 코드의 경우 PostService.findPost() 메서드에 @Transactional(readOnly=true)를 적용한 상태라 deletePost() 메서드에서 SELECT 쿼리를 또 실행합니다.@Transactional(readOnly=true)은 정말 필요한 곳에만 선택적으로 적용하시나요? 아니면 읽기 전용 메서드는 별도로 구분하시나요?'서비스는 최대한 비즈니스 로직만 수행하고, 정책 유효성 검증은 다른 위치에서 진행하는 것이 좋다'라는 분들도 있던데, 보통 어떤 식으로 처리하시나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
remove 메서드 관련해서 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 엔티티 매니저 remove() 메서드 관련 질문이 있습니다.remove는 영속성 컨텍스트의 1차 캐시에서 엔티티를 삭제하고, DB의 데이터를 delete 해주는 메서드로 알고 있습니다. 여기서 문제는 1차 캐시에서 엔티티를 삭제한다는 것이 "전체 데이터를 지우는 것(key:value)"인지 아니면 "해당 식별자에 할당된 데이터(value)"를 지우는 것인지가 궁금합니다. 위에서 그림에서 member를 remove 한 후에 remove된 member id를 받아 조회를 수행했습니다.저는 1차 캐시에서 삭제된다고 알고 있었기에 select 쿼리가 실행될 것이라고 예상했으나 다음과 같이 select 쿼리가 실행되지 않았습니다.제가 remove를 제대로 이해못한 것 같은데, remove를 수행하면 1차 캐시에서 바로 삭제되지 않는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
java.lang.NoClassDefFoundError: javax/persistence/Transient 에러
안녕하세요! 아래 코드 추가 후에 api를 요청하면 java.lang.NoClassDefFoundError: javax/persistence/Transient 에러가 뜨더라고요.@Bean Hibernate5Module hibernate5Module() { return new Hibernate5Module(); }그래서 뭐가 문제인지 확인해봤는데요.아마도 버전 이슈인 것으로 생각이 되어서 질문을 드립니다.저는 지금 spring boot 3버전으로 실습을 따라가고 있고, 확인해보니까 spring boot 3버전에는 hibernate 6이 쓰이고 있더라고요...jackson-datatype-hibernate 라이브러리는 아직은 hibernate 5까지만 지원하는 것 같은데... 혹시 jackson-datatype-hibernate 를 대체할 수 있으면서 spring boot 3 에서 돌아가는 라이브러리가 있을까요???아니면 라이브러리를 사용하지 않고, hibernate5module의 역할을 구현할 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
4:17 dto없이 entity
4:17 @GetMapping("items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId")Long itemId,Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setIsbn(item.getIsbn()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setName(item.getName()); form.setAuthor(item.getAuthor()); model.addAttribute("form", form); return "items/updateItemForm"; 여기에서 Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setIsbn(item.getIsbn()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setName(item.getName()); form.setAuthor(item.getAuthor()); 이 부분은 엔티티를 dto화 시켜주는거와 원리 같은건가요? 만약 @GetMapping("items/{itemId}/edit") private String updateItemForm(@PathVariable Long itemId,Model model){ Item item = itemService.findOne(itemId); model.addAttribute("form",item); return "items/updateItemForm"; } 이런식으로 entity를 바로 form으로 넘겨주게 되면 문제가 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
야생형 학습에 대한 안내가 수강전 답변과 mvc1편에서의 답변이 달라서요!
야생형수강 순서 -> 관련 답변은 이런데----스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술스프링 핵심 원리 - 기본편 현재 강의모든 개발자를 위한 HTTP 웹 기본 지식스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술스프링 MVC 2편 - 백엔드 웹 개발 활용 기술그리고 다음 순서로 듣습니다.1. 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발(빠르게 영상을 보면서 코드만 따라하기)2. 자바 ORM 표준 JPA 프로그래밍 - 기본편3. 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발(진지하게 복습)4. 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화여기까지 진행하면 토이프로젝트를 진행하실 수 있을거에요.그리고 이후에 다음 내용을 들이시면 됩니다.5. 실전! 스프링 데이터 JPA6. 실전! Querydsl+db 접근 강의 출시 전 답변이였고, db강의관련 순서는 mv2 다음에 2개 들으라고 적혀있었구요 또 다른 답변에요!mvc 1편 강의마무리에서 야생형을 소개할때는추천 학습 방법 스프링 입문과 스프링 핵심 원리를 듣고 나면 스프링으로 개발하는 가장 중요한 기본 지식을 쌓은 상태가 됩니다. 그래서 바로 스프링 부트와 JPA 실무 완전 정복 로드맵에 들어가는 것도 좋은 선택입니다. 스프링을 실무에서 어떤 식으로 활용해서 개발하는지 먼저 배워두고, 이후에 스프링 완전정복 로드맵를 통해 스프링 MVC나 스프링 데이터 접근 기술 같은 부분은 더 깊이있게 학습하시면 됩니다.라고 하셔서요! 문서에도 그래서 저는 입문,기본,http 요청,mvc1편 다 듣고->실전해보고 나서 되돌아오려고 실전편 1먼저 듣고 있는데 궁금해져서 물어봅니다 뭐가 맞는건지..답변과 강의에서의 안내가 달라서 여쭤봅니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링 부트 스타터 설정
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.========================================='실전! 스프링 부트와 JPA 활용1' 강의를 수강하기 위해 스프링 부트 스타터에서 프로젝트를 생성하려고 합니다. 그런데 Project에서 gradle을 선택하려고 하는데 gradle-groovy와 gradle-kotlin 이렇게 나뉘어지는데 무얼 선택해야 하나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
데이터 뻥튀기와 관련하여 질문이 있습니다.
join을 해서 가지고 오면 이렇게 데이터가 중복이 되면서 2개로 뻥튀기가 된다고 설명을 해주셨는데요.윗줄과 아랫줄이 완전히 동일한 것은 아닌데 이것을 왜 중복으로 보고 뻥튀기라 하는지 이해가 잘 가지 않습니다!제가 나름 이해하기로는 예를 들어 위에 예시로 든 Order가 OrderA 라고 했을 때, 지금 찾고 싶은건 OrderA 라는 Order 하나인데 그 안에 OrderItem이 각각 서로 다른게 2개 들어있어서 OrderA-Boo1 , OrderA-Book2 이렇게 OrderA가 두 개가 조회돼서 뻥튀기라고 보는걸까요? 그런데 이러면 완전히 중복은 아닌거 같기도 하고..어떻게 이해하는 것이 좋을지 궁금합니다!
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Entity 상속관계 매핑 설정 시 request , edit , response 클래스 분리
안녕하세요! 호돌맨님 해당 강의를 보면서 토이프로젝트를 진행 중 질문이 생겨서 글을 씁니다.간단한 Quiz 맞추는 프로젝트를 만들고 있는데 Quiz 엔티티에 JPA 싱글테이블 전략 상속관계로 주관식 , 객관식 , 서술형으로 자식엔티티를 생성했습니다.자식엔티티를 생성 하고 보니 기존 Quiz의 Request , Edit , Response 클래스를 어떻게 변경해야하는지 답이 안 생겨서 이렇게 질문 드립니다. 🙇🏻♂️🙇🏻♂️🙇🏻♂️🙇🏻♂️자식 엔티티 각각 Request , Edit , Response 클래스 생성 -> 컨트롤러 파라미터에서 어떻게 받지? 컨트롤러 메서드로 분리시켜야하나? -> 그럼 프론트엔드에서는 더더욱 복잡해진다.기존 Quiz Request, Edit , Response 의 각각 자식 엔티티의 필드 추가 -> 컨트롤러 파라미터에거 받을 수 있고, 컨트롤러 메서드가 분리 필요 X -> 컨트롤러에서 데이터 검증은 어떻게 진행되는거지? 객관식인 경우 보기 필드가 필수값일텐데 보기 멤버 변수에 @NotBlank를 추가한다면 주관식이나 서술형 문제유형일 경우엔 오류가 나타나는 상황코드가 추가된 노션 링크 전달 드리겠습니다.https://devysk.notion.site/Entity-request-edit-response-c7433eccd6e24ee486a60bd59013a2a8
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Address를 분리하는 이유
@Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); // Best Practice }@Getter @Setter public class MemberForm { @NotEmpty(message = "회원 이름은 필수 입니다.") private String name; private String city; private String street; private String zipcode; }@GetMapping("/members/new") public String createForm(Model model) { model.addAttribute("memberForm", new MemberForm()); return "members/createMemberForm"; }@PostMapping("/members/new") public String create(@Valid MemberForm form, BindingResult result) { if (result.hasErrors()) { return "members/createMemberForm"; } Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode()); Member member = new Member(); member.setName(form.getName()); member.setAddress(address); memberService.join(member); return "redirect:/home"; } [1번째 코드블럭] Address를 따로 분리하면, [2번째 코드블럭] MemberForm을 만들어야만 하고, [3번째 코드블럭] createMemberForm.html 에 보낼 때 MemberForm객체를 보내어, [4번째 코드블럭]사용자에게 입력받은 정보를 다시 MemberForm에 담아 가져온 후, 값을 하나씩 꺼내어 Member객체에 담아 join 시키는데, 저의 관점에서는 이점이 보이지 않는다고 생각이 듭니다. [질문1]Address를 따로 객체로 만들어서 빼 둔 이유가 궁금합니다. [질문2]그렇게 따로 분리한데는 그에 따른 이득이 있을텐데, 그 경우도 궁금하구요.[질문3]주소정보(3개-city,street,zipcode)가 아닌 훨씬 많은 경우엔 더 편해지나요? 그런 예시가 딱 떠오르지가 않아서 혹시 실무에서의 예시가 있으시면 알려주세요.[질문4]추가적으로 계좌정보 (은행, 계좌번호, 예금주)를 입력받아 MEMBER를 만들 경우에 Address를 만든 것 처럼 동일하게 만들면 되나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 1차캐시
영속성 컨텍스트와 1차 캐시가 같은 개념인지 궁금합니다.
-
해결됨실전! Querydsl
안녕하세요. 실전 모든 강의 수강했습니다.
[질문 내용]안녕하십니까.김영한 강사님의 모든 실전 강의를 다 들었습니다. JPA 관련 고퀄리티의 강의 정말 감사합니다.저희 회사에서 이번 프로젝트에 JPA를 적극 도입하고자 하는데 기존 수업을 들었던 환경과 조금 달라 이렇게 문의를 하고자 합니다.저희 회사에서 여러 DB (최소 4개 이상)를 한 스프링 백엔드에서 다뤄야하는 상황이 되었습니다. 이 상황에 JPA로 DB를 각각 연결하여 사용하는 것이 가능할까요? 또한 성능적으로도 문제가 없을 지 궁금합니다.