묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
ItemServiceImpl.java 클래스를 만들지 않은 이유
강사님 안녕하세요, 강의를 듣다 궁금한 점이 있어서 글 올립니다. 보통 ItemService 같은 서비스 클래스는 구현체를 만드는 것으로 알고 있는데, 혹시 강의처럼 ItemServiceImpl 클래스를 안만들고 바로 구현해도 크게 문제되지는 않는건지 궁금합니다. (JPA라서 그런건지 아니면 예제이기 때문에 단순화 시키신건지 등 ..) 답변 부탁드리겠습니다! 감사합니다!!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 Entity Insert시 질문
안녕하세요 최근 JPA 강의를 들으며 프로젝트에 반영하는 재미가 한둘이 아닙니다. 좋은 명강의에 감사드립니다. 연관관계가 존재하는 엔티티 등록에 관련하여 질문이 하나 있습니다. 상황 : - ORDER_ITEM 을 insert하려는 상황. - ORDER_ID, ITEM_ID 값은 갖고 있는 상황. 1. Order order = OrderService.fetchById(orderId); // order id로 Order Entity 가져오기 Item item = ItemService.fetchById(itemId); // item id로 item Entity 가져오기 oderItem.addOrder(order) // Order Entity 연관관계 등록 .addItem(item) // Item Entity 연관관계 등록 save(orderItem); // Entity 등록 위와 같이 OrderItem을 등록하면 쿼리가 총 3개가 날아가게 됩니다. 1. orderId를 통한 Order 조회 쿼리 2. itemId를 통한 Item 조회 쿼리 3. orderItem 삽입 쿼리 의문점 - FK로 등록되는 값인 orderId와 itemId는 이미 갖고 있는 상황입니다. - 네이티브 쿼리를 사용한다면 Insert문 한번만 실행해도 충분히 가능합니다. (어차피 실 등록되는 data는 orderId와 itemId 뿐일 테니까요) - 이미 등록될 FK 값들은 갖고 있는 상황에서 굳이 Select문을 추가로 날릴 필요가 있을까란 의문점이 생깁니다. - 만약 차후 Table에 연관관계가 5개라면, 10개라면,,, 한번의 Insert문에 쿼리가 n+1이 수행되는 격입니다 2. 그래서 id만 갖고 있는 빈 Entity를 생성하는 방안으로 변경하였습니다. // id만 갖고있는 빈 Entity 생성 Order order = Order.builder() .id(orderId) .build(); Item item = Item.builder() .id(itemId) .build(); oderItem.addOrder(order) // Order Entity 연관관계 등록 .addItem(item) // Item Entity 연관관계 등록 save(orderItem); // Entity 등록 위와 같이 구현하면 insert문이 한번만 수행됩니다. 1번에서의 단점이 해소되었다 생각합니다. 의문점 - 매우 위험한 코드라는 생각이 듭니다. - 만일 다른 개발자가 외부에서 orderItem.getOrder() 를 통해 확인했더니 객체가 있어, order.getStatus(), order.getOrderDate()....... Order Entity를 사용하는 로직을 추가했습니다. 그렇게 된다면 실행 시, nullpointerexception이 발생하겠지요. (Order Entity 안에는 사실 pk만 들어있는 빈 Entity니까요) - 또한 JPA가 추구하는 방향성에 어긋난다는 느낌도 지울 수가 없습니다.( 객체 지향 설계를 지원하는 JPA지만 위는 오히려 일종의 야매(?)를 통해 관계형 데이터베이스의 냄새가 물씬 풍깁니다. ) 이를 해결할 수 있도록 jpa가 제공하는 기능이 있을까요? 혹은 대처방안이 있을까요? 없다면 위의 두가지 케이스 중에서 현업에서는 혹은 영한님께서 생각하시기에는 어떤 방법을 추천하는지 의견을 여쭙고 싶습니다. 긴 글을 읽어주셔서 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@MappedSuperclass 질문
안녕하세요 조금 초보적인 질문인데 @MappedSuperclass 를 추상 클래스로 사용했는데 인터페이스로 사용을 할 수 있나요? 만약 기존 엔티티가 이미 상속을 받고 있을 때 추상클래스 상속이 안되면 어떤식으로 풀어가야할지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
findById 반환타입 Optional
안녕하세요 선생님. 좋은 강의 매번 감사합니다! 강의를 듣고 토이프로젝트중에 질문이 생겼습니다! 강의 21분쯤에 스프링 데이터 JPA가 제공하는 findById의 반환값을 받아올때 반환값이 없을 수도 있기 때문에 Optional이고 강의에선 편의상 get()으로 가져온다고 하셨습니다! 강의에서 orElse 로 처리한다고 간단하게 언급해주셨는데, 실무에서는 그럼 위와 같은 상황에서 어떤식으로 가져오나요? 관련되어서 조사를 해보았는데 orElse로 값이 없을때 반환할 값을 넣어준다고 하더라구요. 그럼 이 테스트에서는 값이 없을때 반환할 객체 하나 생성해두고 orElse에 넣으면 되는건가요?
-
미해결실전! Querydsl
JPAQueryFactory를 필드로 제공하는 경우
new JPAQueryFactory(em)을 굳이 @BeforeEach에 포함시켜야 할까 생각이 들어 코드를 다음과 같이 수정해봤는데요. @AutowiredEntityManager em;JPAQueryFactory queryFactory = new JPAQueryFactory(em);@BeforeEachpublic void before() {// queryFactory = new JPAQueryFactory(em); 그리고 테스트를 실행하면 queryFactory.select(m) 부분에서 NullPointException이 발생합니다. 제 생각에는 EntityManager가 스프링 빈으로 등록되기 전에 new를 통해 JPAQueryFactory를 생성하려 하니 문제가 생겼다고 생각했는데 맞을까요? 아니라면 어떤 이유로 exception이 생기는지 여쭙고 싶습니다:)
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 질문이 있습니다
안녕하세요 강사님 오랜만에 또 돌려보네요.! 다름이 아니라 OneToOne 연관 관계에서 Member입장에서는 Lokcer가 있는지 알려면 Locker 테이블을 찾아야 하기 떄문에, 프록시로 설정할 이유가 없다고 하셨습니다. (여기 까진 이해 했습니다) 그런데 그럼 public class Team { @ManyToOne List<Member> members = new ArrayList<>(); } Team도 마찬가지로 member_id 컬럼이 실제 DB에 없기 떄문에 Member테이블을 조회해야하는 하는데, 여기서는 프록시가 동작하는 이유에 대해서 궁금합니다. @ManyToOne에서는 지연로딩이 동작하고, @OneToOne에서만 동작하지 않는 이유가 궁금합니다. (둘 다 값이 없어서 상대 테이블을 조회해야 하는데도 불구하고)
-
미해결실전! 스프링 데이터 JPA
서버가 여러대일때 createdDate, updatedDate 처리?
안녕하세요. 보통 createdDate 나 updatedDate 같은걸 등록할때 서버쪽에서 시간을 얻어서 등록하나요? 만약 서버가 여러개 있다고 할때 각 서버마다 아주 미세하게 시간이 다를수도 있을거 같은데요. 그럼 실제 A서버에서 등록한 시간이 B서버에서 등록한 시간보다 느린데 빠르게 등록될수도 있을거같아서요. 차라리 db에서 제공하는 default값이나 트리거등으로 값을 넣어주는게 확실하고 더 낳지 않나요? 실무에선 보통 어떻게 처리하는지 궁금합니다. 1. 외부타임서버에서 가져오는건 시간 텀이 있을수 있으니 내부에 NTP서버를 두고 시간갱신을 한다. 이떄 NTP클라이언트들의 시간갱신을 텀을 보통 얼마나 주는지도 궁금합니다. 24시간씩 두지는 않을거 같고 6시간? 1시간? 10분? 2. 시간이 중요할거 같으면 db에서 처리한다. 그리고 시간업데이트할떄 연관된 엔티티끼리의 createdDate 시간은 같이 맞추나요? 아님 조금 차이가 나둬 상관없으니 각각 시간을 구해서 업데이트하나요? 아님딱히 중요한건 아니니 그냥 개별로 업데이트 하나요? 예를들어 ORDER, ORDER_ITEM, DELIVERY, ORDER_HISTORY(ORDER와 N:1의 crud내역) 엔티티가 있을때 같은 주문일경우 각각의 엔티티의 시간을 똑같이 맞추나요? 아님 시간차이가 조금 나도 상관없으니 그냥 엔티티별로 createdDate, updatedDate를 업데이트하나요? 그리고 새 강의 계획은 언제쯤 인지 알수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의중에 실무에 대한 궁금중이 있어서 질문합니다.
강의중에서 SimpleOrderDto 클래스 생성자에 인자로 entity를 받는데 중요하지 않은곳에서 중요한것을 받는건 상관 없다고 하셨는데..! 영한님도 실무에서 dto 생성자에 entity를 직접 받아서 사용하시나요??? 될수있으면 엔티티로 받지 말고 값을로 받아서 채우던가 , 다른 클래스(dto) 변환 해서 넘기는게 좋다는 이야기를 들은적이 있어서요 예를들어 public class CommonWrapper { @Getter public static class SelectMember { private Long id; private String writer; private String contents; private String mention; private SelectMember(Long id, String writer, String contents, String mention) { this.id = id; this.writer = writer; this.contents = contents; this.mention = mention; } public static SelectMember from (Member member) { return new SelectMember(member.getId(), member.getWriter(), member.getContents(),member.getMention()); } } 궁금해서 여쭈어봅니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
dto entity 변환은 어느 곳이 적절할까요?
1) dto -> entity 2) entity -> dto 각각의 변환은 어디가 적절할까요? 1번 2번 둘 다 controller 혹은 service 에서 하게 되는데 사람마다 스타일이 각각 다른 것 같습니다 영한님이 프로젝트에서 사용하시는 방법이 궁금합니다 (그리고 그것이 개인적으로 선호하는 방법인지도 알고 싶습니다 선호하는 것과 실제 프로젝트에서 사용하기 모호한 부분이 있을 수도 있기에 추가로 질문 드립니다) 영한님이 사용하시는 방법에 대한 이유도 알 수 있었으면 합니다 감사합니다
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
PC-IP 적용 후, Gateway 경유 GET/POST `/users` - 접근 시 모두 Access Denied 가 뜨는 원인을 알 수 있을까요?
몇번씩 강의를 돌려봐도 틀린곳이 보이질 않아서 여러 테스트를 해보았습니다. PC할당IP >>> MSA 직접 접근 시에는, 잘 작동하였는데 반해,Gateway 경유(localhost) 시, `/welcome` `health_check` `users` GET/POST 모두 차단 되더라구요.학습진행이 어렵게 되어 버렸어요..ㅠㅠㅠ. 강사님.고민끝에 유추되는 원인인데요,Gateway 서버의 IP 주소가 문제가 되어 이런현상이 생긴걸까요? MSA(user-service) 는 PC-IP 를 통한 접근만 허용할 것이고, Gateway 를 통한 접근 IP 는 localhost( 127.0.0.1) 로 되어있으니, MSA 는 Gateway 로 부터 오는 요청은 WebSecurity 설정으로 인해 차단된다 혹시 이런 논리일까요? 또는 이런 방식도 유추됩니다. .hasIpAddress("IP") 에 허용 IP 를 늘린다 혹시 몰라 프로젝트 압축파일 링크를 달았습니다 Link: `Users MicroService - Routes 테스트 까지 실습진행예제` 읽어주셔서 감사합니다.
-
해결됨실전! 스프링 데이터 JPA
질문 드립니다.
안녕하세요 강사님 업무를 하다가.. 궁금한 부분이 있어서 질문을 남기게 되었습니다. 질문드립니다. 질문1 Repository에서 @Query 어노테이션을 사용해서 nativeQuery = true 옵션을 주고 Entity 객체로 값을 반환을 받는데 네이티브 쿼리에서 추가한 연산한값 또는 rownum 같은 값을 Entity 객체로 받을수 있을까요? 구글링을 해보니까 안된다고 하는것 같아서요 Entity 객체에 @Transient 애노테이션을 붙여서 필드를 생성해 놓았지만 해당 애노테이션은 엔티티를 만들때 컬럼을 생성하지 않는 역할이라서 역시 안될것 같았지만 역시나 안되네요 혹시 다른 방법이 있을까 해서 질문 남깁니다 질문2 Spring Data Slice를 사용해서 페이징을 구현하려고 하는대요 커서의 개념으로 조회를 하려고 합니다. 그래서 PageRequest.of(0,3)으로 고정 해 놓고 id 값을 기준으로 3개씩 조회를 하려고 하였는데 (id < 입력 값) order by 정렬 기준으로 id를 사용할수가 없는 경우에는 혹시 다른 방법이 있을까요? (순차적으로 id 값이 정렬되어 있지 않은 경우) 그래서 rownum을 사용해서 조회를 하였는데 Entity 객체로 rownum이 반환이 안되더라구요;; 읽어 주셔서 감사합니다^^ Projections 이건 지금 처음 보았는데 안되면 Projections 고려해 바야겠습니다^^ 감사합니다.
-
해결됨실전! 스프링 데이터 JPA
em.flush() 궁금한 게 있습니다.
12분 쯤 벌크연산에서 flush()를 날린 뒤에 벌크연산을 수행하니 db에는 41살, 영속성 컨텍스트에는 40살인 채로 남고 그 상태에서 명시적으로 em.flush()를 날리면 db에 40살이 찍히리라 예상 했는데... flush()할 때 단순히 DB와 동기화하는 게 아니라 변경 감지를 통해 쓰기 지연된 부분만 내보내는 것으로 이해했는데 비슷한가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 QueryDSL이 안됩니다..
안녕하세요. 강사님 https://www.inflearn.com/questions/149157 여기 글이랑 같은 오류인데 강사님이 알려주신 링크 들어가니까 권한이 없다고 나오는데.. 방법을 모르겠습니다. ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
mappedBy와 cascade를 함께 썼을 때
mappedBy로 설정된 컬렉션은 읽기만 가능한 줄 알고 있어서 cascade가 적용이 안되는 게 아닌가..? 싶었는데 컬렉션에 엔티티를 추가할 경우 엔티티도 영속화 해주지만 그 엔티티의 FK 값은 반영이 안되는 것 같은데 제가 제대로 이해한 게 맞을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
"mvn spring-boot:run"은 구동에 문제없는데, 옵션을 주면 Build Fail 나는 원인을 알 수 있을까요?
알찬 강의 감사드립니다.초장에 막히는 부분이 있어 질문드려보아요. "mvn spring-boot:run"은 구동에 문제없는데, 옵션을 주면 Build Fail 나는 원인을 알 수 있을까요? > mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'[INFO] Scanning for projects...[INFO][INFO] ----------------------< com.example:user-service >----------------------[INFO] Building user-service 0.0.1-SNAPSHOT[INFO] --------------------------------[ jar ]---------------------------------[INFO] ------------------------------------------------------------------------[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 0.296 s[INFO] Finished at: 2021-05-22T20:43:08+09:00[INFO] ------------------------------------------------------------------------[ERROR] Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the fo rmat <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: val idate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test -sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-p ackage, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clea n, pre-site, site, post-site, site-deploy. -> [Help 1][ERROR][ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.[ERROR] Re-run Maven using the -X switch to enable full debug logging.[ERROR][ERROR] For more information about the errors and possible solutions, please read the following articles:[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException 혹시몰라서인텔리제이 Maven 설정 캡쳐 받아보았습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션에 대한 fetch join은 1개만 사용해야 한다에 대한 질문
안녕하세요 영한님. 간단한 질문을 드리고 싶어서 글 남기게 되었습니다. 강의 마지막에 "컬렉션(일대다 관계)에 대한 fetch join은 1개만 사용해야 한다. 2개 이상 붙이면 일대 다대 다 형태가 되어버리기 때문에... " 라고 설명해주셨습니다. 여기서 2개 이상 사용하는 케이스는 아래 두 케이스를 모두 포함하는 것인지 궁금합니다 :) - Order 클래스 내부에 일대다 관계에 대한 필드가 2개인 경우 - Order 클래스 내부에 일대다 관계에 대한 필드가 1개고, 그 필드의 객체 내부에 일대다 관계에 있는 필드가 존재하는 경우 문득 생긴 고민이라 적절한 예시가 생각나지 않네요ㅠㅠ 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
RemoveRequestHeader 이유
안녕하세요 1. RemoveRequestHeader 를 쓰는 이유가 매번 새롭게 요청받기 위함이라고 하셨는데, 매번 새롭게 요청받아야하는 이유가 무엇일까요? 2. 또한 만약 RemoveRequestHeader 가 존재하지 않는다면 어떻게 될까요? 3. Front 에서 Refresh_token을 httpOnly cookie에 담아서 보내는데 이 경우에는 RemoveRequestHeader 를 사용하지 않고싶다면 쓰지 않아도 될까요? 그로 인해서 발생하는 문제는 무엇일까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
H2 SQL 접속 불가 문제입니다.
안녕하세요... 다름이 아니라 DB SQL 문제 때문에 질문드립니다 해당 오류는 H2 DataBase의 접근 오류 문제인거 같습니다. 바로 앞전에 엔티티 매핑에서 부터 뭔가 이상해서 DB를 초기화하고 다시 돌려보니 아예 DB에 데이터 쓰기 자체가 안되는거 같습니다. 참고로 H2 SQL, MY SQL 방언 문제 할 수 있는거 죄다 다해봤는데 도저히 먹히지 않습니다. 다른 방법들은 아예 Spring을 사용해야 되서 아예 xml 파일에서 작동 되지가 않습니다...
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jwt 토큰은 보통 어디에서 보관을 하나요?
안녕하세요 강의 재밌게 보고 있습니다. 제가 프론트엔드에는 무지하여 잘 모르겠는데 jwt 를 서버에서 반환해주면 프론트에서는 일반적으로 어디에 저장을 하다가 요청 보낼때 마다 재사용하나요? 로컬 스토리지나 쿠키 정도 밖에 떠오르는게 없는데 프론트엔드 현업에서 자주 사용하는 방식이 있나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
entity끼리 연관관계
안녕하세요! 수업 너무 잘 듣고 있습니다 ㅎㅎ 제가 node로 공부하다가 해당 부분이 헷갈려서 질문 남깁니다! 추가로 entity끼리 연관관계를 설정해주었는데 연관관계메소드가 필요한 이유가 잘 이해가 안가서 알려주시면 감사드리겠습니다! public void setMember(Member member) { this.member = member; member.getOrders().add(this);} - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.