묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 반환 질문입니다
그 예전에 영한님께서 JSON으로 반환 할 때 쿼리를 통해서 얻은 값을 그대로 반환하지 말고 클래스로 묶어서 반환하라고 하셨던게 기억이 납니다. 쿼리를 통해서 얻은 결과가 예를들어 List<PersonDto> name : ~~~ age : ~~~ address: ~~ 이런식으로 되어 있을때 이 리스트를 그대로 반환하면 JSON 형식이 배열로 시작해서 그 후에 값을 수정 할 수 없다고 들었던거 같은데요!! 질문이 있습니다 저 List<PersonDto>를 감싸는 하나의 클래스를 만들때 예를 들어서 class PersonExmpleDto{ private ArrayList<PersonDto> persondto; ] 이런식으로 반환 할 때 클래스 이름을 어떻게 해야 할 지 모르겠습니다.... 쿼리를 통해서 얻은 List로 묶은 PersonDto를 하나의 클래스에서 반환하고자 할 때 클래스의 네이밍은 어떤식으로 하나요?class PersonListDto{ private ArrayList<PersonDto> persondto;} 이런식으로 하나요...??
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
조금 더 안전한 방법과 조금 더 개선한 방법의 차이
안녕하십니까 강사님 ! 질문있습니다 :) 조금 더 개선한 방법의 원리는 만약 인증이 들어왔을 때, Username 과 시리즈는 일치하지만 토큰이 일치하지 않으면 토큰이 해커에 의해 탈취되었다고 간주해서 모든 토큰을 삭제하는 원리인데, 조금 더 안전한 방법도 Username 은 일치하지만 토큰이 다르면 똑같이 탈취되었다고 간주하고 모든 토큰을 삭제하면 동일하게 동작하지 않을까 하는 궁금증이 생겼습니다. 전자랑 후자 방법 둘다 해싱에 패스워드는 사용되지 않아서 복호화 된다고해도 계정이 탈취당하는 일이 없는데 굳이 시리즈를 이용하는 이유가 있을까요??
-
미해결실전! 스프링 데이터 JPA
JPQL 에 대해서 질문이 있습니다 ..!
안녕하세요 영한님. 영한님의 강의를 한번씩 보고 개인적으로 공부를 하면서 연습을 해오고 있는데. 수업 예제는 아니지만 궁금한 점이 생겨서 검색을 해도 잘 나오지 않아 질문을 남기게 되었습니다. --------------------------------------------------- 상품을 대여하는 기능을 작성해 보기위해 만든 클래스 입니다. 연관관계는 단방향 매핑이 좋다 말씀하셔서 단방향으로 구성을 해봤습니다. 이 클래스에 있는 user는 빌리는 사람의 클래스입니다. product 클래스 안에 상품의 주인인 User클래스를 매핑해 주었습니다. User클래스에는 매핑된 테이블이 없습니다. 이렇게 작성이 되어있고 만약 자신이 대여를 신청한 상품을 조회하고 싶은 쿼리문을 작성하고 싶은데 이렇게 작성을 했었습니다. 하지만 https://www.inflearn.com/questions/15876 이 질문의 글에 fetch 조인에 대상이 되는 곳에는 where절을 사용하면 안된다 말씀을 해주신 것을 보고 다른 방법이 떠오르지가 않아서요 .. 혹시 더 좋은 방법이 있다면 어떠한 방식으로 해결해 나가면 좋을까요? 수업예제와 다른 주제로 질문을 드려 죄송합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA 개발 관련 질문입니다
19:00 시간에 보고 궁금한게 있습니다. JPA 실행해서 나온 sql 스크립트를 보고 수정할 부분이 있으면 수정해서 ddl 을 직접 작성하신다고 하셨는데, 수정된 ddl 에 맞게 JPA 에서도 코드를 수정해야하는걸까요?아래 방식으로 개발이 진행되는 것이 맞는지 궁금하네요 JPA 코드작성 -> DDL 스크립트 확인 및 수정 -> DDL 직접 작성하여 DB에 반영 -> 수정된 ddl에 맞게 다시 JPA 코드 수정 -> 애플리케이션 실행 (뭔가 질문이 이상한 것 같기도한데; 이해가 어려운 부분은 편하게 말씀 부탁드립니다)
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의자료
안녕하세요~ 강의자료 올려주시면 안될까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional(readOnly=true) 설정에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요, 최근 부하테스트를 진행하며 성능개선을 해보려하고 있습니다. 그 중 단순 DB 조회 API에 대해 테스트를 진행하고 있는데, 스레드 덤프를 확인한 결과 SessionImpl.doFlush()가 호출되는 것을 보고 트랜잭션이 끝나는 시점에 자동으로 flush가 호출되는 것을 발견했고, 때문에 readOnly 설정이란 것을 찾아서 설정하고 다시 테스트를 진행했습니다. 반복해서 테스트를 진행해 봤는데, readOnly를 설정하지 않았을때가 TPS가 높게 측정이 됩니다. 왜 그런지 알 수 있을까요.. 그림은 순서대로 readOnly를 설정하지 않았을 때와 설정했을 때 입니다. 테스트 대상 API의 코드는 아래 링크의 getMovieList() 입니다. https://github.com/hapHollys/booook/blob/main/src/main/kotlin/com/haphollys/booook/presentation/controller/MovieController.kt
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
이미 db가 있어서 jpashop db를 추가하고자 하시는분들 편의를 위해 링크 공유합니다.
h2 데이터베이스 추가
-
미해결실전! 스프링 데이터 JPA
jpa 여러개 repository findById
안녕하세요... 토이프로젝트를 하다가 궁금한것이 있어서 문의드립니다... 제가 원하는건 결론적으로 이렇습니다. if(){ Test1Repository.findById(Long Id); }else if(){ Test2Repository.findById(Long Id); } else { Test3Repository.findById(Long Id); } 이런식으로 계속 분기처리하기보단 레포지토리를 하나의 값으로 findById를 할수 있는지가 궁금합니다..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
무한 대기 설정 질문드립니다.
안녕하세요. 강의를 보고 따로 책으로 학습중인데 책 내용에 서비스에서 서비스 끼리 호출할때 timeout 설정을 하지 않으면 무한정 대기가 걸릴 수 있다고 하더라고요.그런데 강의 실습하면서 따로 timeout 설정한 부분이 없었던 거 같았는데, 혹시 제가 놓쳤던 것인지 아니면 의도적으로 설정하지 않으신건지 궁금해서 여쭤봅니다!감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관 관계 매핑 vs 매 번 참조 객체 쿼리 날리기 성능 질문
안녕하십니까 최근 선생님의 수업들을 열심히 듣고 제 것으로 만들기위해 정진하는 학생입니다. 다른 것이 아니라 일반 게시판의 댓글 기능을 구상 중입니다. 현재 상황 엔티티 댓글, 멤버 의도하는 기능 추후 댓글 작성자의 닉네임을 클릭하면 해당 작성자의 프로필 페이지를 보여줄 것이다. 연관 관계 현재는 댓글이 작성자(멤버)를 단방향으로 연관관계를 가지고 있다. 궁금한 점 댓글들을 불러올 때 연관되어있는 댓글 작성자(멤버) 또한 select문으로 불러오는 것을 확인 중인데, 그로 인하여 쓸 데없는 정보까지 불러와진다.(사용자의 로그인id, 비밀번호 등) -> DTO로 처리 중 그러면 댓글 작성자(멤버)의 id(기본키)와 닉네임만 댓글 엔티티에 저장 후 누군가 댓글 작성자의 프로필 페이지 확인 시 별도로 쿼리를 날려 프로필 페이지를 들고오는 것이 더 효율적인 것인가? 라는 의문입니다. 성능적인 차이가 별로 나지 않을 경우 저는 연관관계 매핑 후 DTO로 처리하는 것이 확장성에서 더 유리하다고 생각합니다. 이에 대해 현업에서 어떻게 사용하는 지 힌트 살짝만 주실 수 있을까요? 아니면 키워드라도 알려주시면 제가 찾아서 더욱 공부하겠습니다. 김영한 선생님의 수업을 들으며 궁금한 점은 항상 검색하여 해결하였으나 데이터베이스 설계는 진짜.. 도저히 함부로 손을 못대고 있습니다. 아마 말씀해주셨는데 제가 놓친 것 일 수도 있습니다. 죄송합니다 추가적으로 스프링 고급편 출시하는거 축하드립니다. 백엔드에서 자주 쓰이는 디자인패턴과 관점 지향 프로그래밍 전반적인 부분이 정말 궁금했었는데 유용한 수업이 될 것 같습니다. 감사합니다
-
미해결
JPA관련 질문이 있습니다!!
현재 진행중인 프로젝트가 spring boot, mybatis 기반인데 jpa 적용 및 정상 동작까지 확인은 했습니다! 다만 현재 프로젝트 구조 상 문제점이 하나 발견되서 해결책이 있을지 여쭤봅니다~! * 문의사항 - DB 조회 시 조회대상 데이터 베이스를 유동적으로 변경할 수 있을까요? 현재(mybatis) 사용 예시 -> select *From ${DB_NAME}.emp 위와같이 DB명을 파라미터로 받아 유동적으로 대상 DB를 변경하면서 조회를 해야하는데 JPA에서도 관련 기능이 있는지 궁금합니다!
-
해결됨실전! Querydsl
QHello qHello = new QHello(
좀 쓸데없는 곳에 꽂혀있는 거일 수도 있는데 new QHello("h")에서 "h"는 무슨 역할을 하나요 ? 조금 찾아보니까 static을 사용해서 QHello.hello하면 new QHello("Hello") 라고 하던데 문자로 엔티티를 찾는 용도였으면 강의에서 "h"로 넣기도 했으니까 아닌 것 같고.. intelliJ로 함수를 쫓아쫓아가보니까 한도 끝도 없어서.. 초보인 저에게는 잘 모르겠더라구요 new QHello("h")에서 "h"의 용도가 무엇일까요 ?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계 주의점에 관한 질문
안녕하세요. 좋은 강의 감사합니다. 영상의 9분40초 쯤에 관한 질문인데요. 테이블은 양방향, 객체는 단방향x2개로 이루어진 구조이다보니 객체 관점에서는 연관관계 주인과 가짜 매핑 둘 다에 값을 변경해준다는 점은 이해했습니다. 이 내용 외적으로, @GeneratedValue의 IDENTITY전략은 persist() 시점에 곧바로 INSERT가 이루어진다고 했습니다. 그렇다면, 영상 9분40초 코드를보면, team객체 생성 후, member객체가 생성된 상태인데, member객체에 team값이 들어가고 INSERT가 수행됐음에도 불구하고, Team을 find하여 찾은 List<Member>에는 값이 들어있지 않습니다. 1차 캐시를 고려한다고 해도, INSERT가 되는 시점에서는 곧바로 1차 캐시 또한 반영이된다고 이해하고 있습니다. 그렇다면, Member가 INSERT되는 시점에서 team을 포함하여 1차 캐시에 등록이 됐을거라고 생각했습니다. 그럼 남은 원인은 트랜잭션이 반영되지 않아서라고 생각이되는데, 혹시 제가 생각한 추측이 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA에서 엔티티를 삭제 혹은 업데이트 할 때 리턴에 대해 질문드립니다.
안녕하세요! 엔티티를 JPA로 삭제 혹은 업데이트 처리 후에 반환형이 void 아니면 해당 엔티티의 id 값을 반환 받는데요. 혹시 삭제나 업데이트를 하는 와중에 DB커넥션 오류가 발생한다면, 개발자 입장에서 Repository에서 오류가 난 뒤 에러처리를 어떻게 할 수 있을까요? 답변 기다리겠습니다. 감사합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
URI 구조 질문
안녕하세요 영한님 야생형코스를 듣고 토이프로젝트를 하던 도중 URI를 어떤 식으로 정해야 할지 감이 안잡혀서 활용1편에 있는 컨트롤러들의 URI를 참고하는 도중 궁금한점이 생겨서 여쭈어보게 되었습니다. MemberController와 ItemController의 등록과 관련된 URI에서는 /members/new , /items/new와 같이 복수단어를 사용하였지만 OrderController에서는 /order와 같이 URI가 단수로 되어있었습니다. HTTP 강의 중 비슷한 내용이 있던게 기억나서 찾아보았더니 HTTP 메서드 부분에서는 "계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장(member -> members)" 이라고 설명해 주셨지만 혹시나 order의 경우 다른 뜻이 있으셔서 URI를 단수로 작성한건지 궁금해서 여쭈어 보게 되었습니다!
-
미해결실전! 스프링 데이터 JPA
더티체킹
안녕하세요 학습을 진행하던 중 궁금한 사항이 생겨 질문드립니다. 다름이아니라 더티체킹에 관한것인데요 ```java @Transaction public User updateAuthority(String userName, UserRole new Role) { User user = userRepository.findByUserName(userName); System.out.println("---변경 감지 시작 ---"); user.setRole(newRole); System.out.println("---변경 감지 끝---"); return user; } 아래와 같은 메소드를 실행시켜서 더티체킹이 언제 감지되나 실험해보았는데 보니까 return user를 하고 나서 실행되는거 같더라구요. 혹시 더티체킹이 끝나서 DB에 update 쿼리가 나가는 시점이 정확히 알 수 있을까요? 수업 너무 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Mockito 를 사용하여 테스트할 때, 테스트 요구사항의 반영 질문
이번 강의의 1분 30초 쯤, 현재 작성하는 테스트 방법이 그다지 좋은 방법은 아니다라는 말을 들었습니다. 그래서 좋은 테스트 방법은 무엇인지 찾아보게 되었고 돌아돌아 Mockito 같은 테스트 프레임워크를 알게되었습니다. 좋은건 일단 맛은 봐야하는 성격이라, 강의를 듣다말고 Mockito 를 사용하여 단위 테스트 하는 방법 알아보는 길로 한참 새버렸습니다 ㅎㅎㅎ Mockito 를 사용해서 OrderService 의 주문 성공에 대한 테스트 코드를 작성해보았습니다. 근데 영한 선생님이 강의에서 작성할 때의 assertEquals 이나 그런 요구사항들에 대해선 테스트를 못해서 제가 테스트 코드 작성을 잘못한건가 하는 생각이 들었습니다. 코드는 다음과 같이 간단하게 작성했습니다. @ExtendWith(MockitoExtension.class) class OrderServiceTest { @Mock MemberRepository memberRepository; @Mock ItemRepository itemRepository; @Mock OrderRepository orderRepository; @InjectMocks OrderService orderService; @Test @DisplayName("주문 성공") void order() { Member member = new Member( 1L, "irostub", new Address("seoul", "street", "10000"), new ArrayList<>()); Item item = new Book( 1L, "itemName", 15000, 2021, new ArrayList<>(), "5pg", "isbn5100"); //given given(memberRepository.findOne(anyLong())) .willReturn(member); given(itemRepository.findOne(anyLong())) .willReturn(item); //when orderService.order(1L, 1L, 100); //then ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class); then(orderRepository).should(times(1)).save(captor.capture()); } } 코드는 위와 같습니다. 뭔가 많이 허전합니다. 강의에서 처럼 assertEqual()에 인자로 넣을 객체를 받아올 방법이 없어서 , orderRepository.save(...) 는 void를 반환하고 orderService.order(...) 은 Long 을 반환하지만 영속성 컨텍스트도 없으므로 null 을 반환합니다. 그래서 결국 테스트 한 것이라곤, Mock 을 통해 적당한 맴버, 상품을 정해놓고 orderService.order(...) 메서드를 실행중에 orderRepository.save(...) 을 잘 호출했는가? 뿐입니다. 이렇게 하는게 맞는걸까요..? (테스트에 대한 강의가 아님에도 이런 질문을 하는게 죄송스러울 따름입니다..ㅠㅠ 근데 어디다 물어볼 곳도 없어서 심란한 마음에 글을 씁니다)
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 관련한 equals()오버라이딩, 제가 이해한 것이 맞나요?
덕분에 스프링, JPA 말고도 자바 전반에 걸쳐서 정말 많은 걸 재밌게 배우고 있어서 감사드립니다. 공부를 해도 의문이 해소되지 않는 부분이 있고, 제가 이해하는 것이 맞는지 확신이 안 가는 것들이 있어 질문드립니다. 1. 왜 2:23초 정도의 equals() 오버라이딩에서, 클래스 비교를 instance of가 아니라 !=로 하였는지 프록시로 생성된 객체는 원본 클래스를 상속한, 생성된 클래스에 속하기에 equals 오버라이딩 할 때, ==이나 !=를 이용한다면 적절한 구현이 이루어질 수 없지 않나요? 1) 기본적으로 instance of를 써야 프록시로 생성된 객체가 원본 클래스와 적절하게 동등성 비교가 가능하다고 알고 있었습니다. 2) 한편, 실전예제에서 instance of를 사용하지 않은 것이 값 타입이라서 그런것이 아닌가 추측했습니다. 왜냐면 값 타입은 식별자를 갖지 않기 때문에 getReference() 메서드로 프록시를 가질 일 자체가 없어서 위의 문제가 발생하지 않으리라는게 제 추측이었습니다. 이와 관련해서 의문이 들었던 부분이: 2. 이전 강의(값 타입 컬렉션)에서 값 타입 컬렉션에 대해 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성해야함: null 입력X, 중복 저장X 이라고 정리했었는데, 그렇다면 값 타입 컬렉션의 경우 PK가 존재하는 것인가요? 또, 그걸 통해서 find나 getReference가 가능한 건가요? 별개로, 값 타입이 불변 타입으로 사용되기에 equals 오버라이딩이 필요하다는 점은 이해했습니다. 마지막으로 3. getter를 사용해서 equals나 hashCode 메서드를 구현하는 것이 프록시 문제를 피해갈 수 있다는 것이 이해가 가지 않습니다. 오히려 저는 getter 사용이 아니라 클래스 판별 부분을 ==로 하지 않고 instance of로 하는 것이 더 맞다고 생각했습니다. 그 이유는 1) 제가 보기에, 위에서 언급했듯이, 프록시가 비교에서 문제가 발생하는 부분은, 프록시로 얻은 객체는 원본 객체와는 다른 클래스(JPA에 의해 생성된, 원본 클래스를 extends 하는 클래스)라는 점이기에 그렇습니다. 2) getter 사용이 아니라 instance of 사용이 프록시와 연관이 있다고 IntelliJ가 안내문으로말해주는 것 같아보였습니다. 단축키로 equals와 hashCode 메서드를 생성하려고 하면 다음과 같은 안내문이 나왔었는데요: generate equals() and hashCode() Accept subclasses as parameter to equals() method While generally incompliant to Object.equals() specification accepting subclasses might be nessesary for generated method to work correctly with frameworks, which generate Proxy subclasses like Hibernate. 생성된 메서드를, 하이버네이트처럼 프록시 서브클래스들을 만드는 프레임워크들과 호환시키고 싶으시다면, 일반적인 Object.equals() 규격과 다르게, 서브클래스들을 포함시키는 것이 필요할 수 있습니다. Use getters during code generation 해당 클래스에 getter 만들지 않으면 당연히 위 옵션을 체크하더라도 getter 메서드 사용하지 않고 구현된다. 제가 잘못 번역한 것인지는 모르겠습니다만 위의 안내문은 제가 위에서 생각했던 것처럼 서브클래스를 포함시키는 것 (!=으로 동등 클래스만 포함시키는 것이 아니라 instance of로 서브클래스까지 포함시키는 것) 이 하이버네이트 등의 프록시 서브클래스 문제를 해결해준다고 말하는 것 같았기 때문입니다. 공부가 얕아서 질문이 많았습니다. 하이버네이트에서 실제 프록시를 생성하거나 할 때 무언가 제가 모르는 부분이 있는 것은 아닌가 해서 하이버네이트 라이브러리에서 em을 extends 하는 Session이나 SessionImpl을 뒤져 보기도 했는데, 도통 답을 찾기가 어렵네요. 도움이 필요합니다..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강사님 안녕하세요. 강의 항상 잘 듣고 있습니다.
질문은.. 강의랑 똑같이 했는데 이상하게 whitelabel error page만 보이네요.. 혹시 datasource 설정해줘야하나 해서 추가해봤는데도 안 되고.. 1편 강의처럼 Spring Security 때문도 아니고.. 원인을 못 찾겠어서 문의드립니다..
-
미해결
스프링 부트와 JPA 활용 2 강의 듣던 중 로드맵이 궁금해서 질문남깁니다.
안녕하세요 현재 스프링 기초 강의 부터 JPA 기초, 실전 1 까지 들으며 야생형 로드맵을 따라가고 있습니다. 그런데 활용 2편 강의를 아직 초반밖에 보지 않았지만 중간중간 MVC 이야기를 하셔서 MVC 파트가 선행 되어야 하는건지 아니면 이 강의를 먼저 끝내고 들어도 되는건지 더 효율적인 학습 순서가 어떻게 되는지 알려주세요 ㅎㅎ