@Test public void findMemberLazy(){ //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); //when Optional<Member> byId = memberRepository.findById(1L); } 위와 같은 코드가 있을때 memberRepository.findById(1L); 를 하면 저는 em.find를 통해서 영속성컨테스트를 조회하기 때문에 select쿼리가 안나간다고 생각이 들었습니다. 하지만 출력결과 select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 where m1_0.member_id=? select 쿼리가 나가는 것을 확인했습니다. https://www.inflearn.com/questions/1014206/%EA%B0%99%EC%9D%80-pk%EB%A1%9C-%EC%A1%B0%ED%9A%8C%EC%8B%9C-%EC%BF%BC%EB%A6%AC%EA%B0%80-2%EB%B2%88-%EB%82%98%EA%B0%80%EB%8A%94-%EC%9D%B4%EC%9C%A0 제 예전 질문에서는 JpaRepository에서의 Method Naming Query의 경우 JPQL로 조회를 하기 때문에 실행전 em.flush()가 일어나서 Direct로 DB에 쿼리가 날아가고 findById는 JpaRepository Interface의 target인 SimpleJpaRepository에 있기 때문에 em.find를 한다고 보았는데 왜 select 쿼리가 나갔는지 궁금합니다.
orderService.class를 예를들면 Order Entity를 저장하거나 find하거나 등 entity위주의 코드만 뒀습니다. 허나 Order Entity뿐만 아니라 OrderForm, OrderDto를 변환해주는 코드가 필요하다면 각 형태를 변화해주는 Service를 따로 만들어야하는지 아님 하나의 Service클래스안에 다 둬야 하는지 궁금합니다. 예로들어 OrderEntity => OrderForm 로바꿔주는 서비스, OrderEntity => OrderDto로 바꿔주는 서비스, OrderEntity를 repository에 넘겨주는(DB에 저장하는) 서비스 이런식으로 각각 나눠서 여러개의 클래스로 만들어주나요??
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 강사님 궁금한것이 있어서 질문 남깁니다 public void returnBook(String bookName) { UserLoanHistory targetHistory = this.userLoanHistories.stream () .filter(history -> history.getBookName().equals(bookName)) .findFirst() .orElseThrow(IllegalAccessError::new); //findFist()는 옵셔널로 반홚나다 targetHistory.doReturn(); } 이 로직에서 만약 한 책을 빌렸다가 반납하면 그 히스토리를 반납완료 상태로 만들어주고 끝내고 다시 그 책을 빌리려고 한다면 새로운 히스토리를 만들어서 List에 저장할텐데 그럼 다시 그책을 반납할 경우 findFirst()를 해서 그 히스토리를 찾아왔을때 이미 반납된 책을 다시 반납하는 행위가 되는것이 아닌건지 궁금해서 질문 드립니다!
안녕하세요. 현재 서비스중인 사이트에 액츄에이터 적용중에 있습니다! 웹에서는 /actuator/prometheus 접근은 되는데 프로메테우스 화면에서 보면 상태가 down이고 에러가 납니다. URL 링크 연결은 잘돼요.. 스프링 시큐리티쪽에서 별도로 처리를 해줘야되는건지... 예측되는 부분이 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 현재 ItemService에서 update 로직을 수행하고 있습니다. 혹시 Item Entity 에서 update 로직을 수행해도 되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 이렇게 오류가 나는데 혹시 왜그런지 알 수 있을까요?
안녕하세요, 강의 정말 잘 듣고있습니다. 다름이 아니라 Entity 반환에 대해서 질문 있습니다. 영한님께서 보안적인 문제, API 유지보수 문제 등 때문에 DTO로 변환하여 반환 하여한다고 하셨는데, 만약 RestApi가 아니라 view로 직접 전달할 때 받아온 Entity를 DTO로 변환 하지 않고 그대로 model에 담아서 보낸다면 어떠한 문제들이 있을까요? 질문 드리기 전에 제가 먼저 생각 해봤을 때 장점은 굳이 새로운 dto 객체를 만들지 않아도 된다는 장점이 있고 단점으론 불필요한 데이터도 반환 되는 문제와 api의 확장 가능성이 힘들다 정도 있다고 생각되는 더 많은 단점이 있을까요?
<해결됨> 같은 질문 링크입니다. https://www.inflearn.com/chats/757401/x27-conditional%EA%B3%BC-condition-x27-%EA%B0%95%EC%9D%98-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B83-0-%EC%9D%B4%EC%83%81%EC%9C%BC%EB%A1%9C-%EC%95%88%EB%90%98%EB%8A%94%EB%B6%84%EB%93%A4 https://github.com/tobyspringboot/helloboot/commit/9db7fbb4b665ad0a21e18fa580d378179b44fa92 spring boot 3에서 적용해보고 있습니다. 제목의 강의에 해당하는 커밋은 위 링크일 것 같습니다. 해당 커밋에서 checkout 한 후, dependencies { implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } implementation 'org.springframework.boot:spring-boot-starter-jetty' testImplementation 'org.springframework.boot:spring-boot-starter-test' } 위와 같이 jetty를 사용하게 해두고 어플리케이션을 실행하면 Unable to start web server, java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpSessionContext 오류는 jakarta.servlet.http 패키지의 HttpSessionContext 자바 클래스를 찾을 수 없음 이렇게 나오는 것 같습니다. 어떻게 해결할 수 있을까요..?
public class JdbcTemplateMemberRepository implements MemberRepository { private final JdbcTemplate jdbcTemplate; public JdbcTemplateMemberRepository( DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } 이 코드 부분에서 JdbcTemplate가 org.spring에 영한님 강의에서는 있던데 제 꺼에서는 없더라고요. 이거 해결책이 궁금합니다. 감사합니다.
참고 https://www.inflearn.com/questions/54688/%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A7%88%EB%AC%B8 페이징 성능 개선해보고 싶은데 전체 데이터를 1000만개씩 넣어놓고 execution 속도 비교는 어떻게 하는지 질문드립니다 메소드 테스트는 spring boot @profile( "test") 에서 진행하고 , jmeter 같은 툴로 외부 환경에서 테이블 만들고, 데이터 넣은후 , 메소드 실행 속도를 측정하는 건가요??
Repository 를 통해서 join 으로 데이터를 가져와서 처리하는것 Entity 에 비즈니스 모델을 넣어서 객체 그래프 탐색을 통해 데이터를 처리하는것. 예를들어 user(1) 과 article(n) 관계가 있다고하면, 유저가 작성한 글의 개수를 구해야되는 문제가 있을때, ArticleRepository.getCountByUserId(Long user_id) user.articles.length 위 두가지 방법이 어느 차이가 있고 어느 방법이 더 선호되나요? 1번 방법은 DB 를 통해 가져와서 DB가 연산을 수행할거고, 2번 방법은 엔티티에서 객체그래프탐색을 통해 FK데이터에 접근해서 메모리에서 길이를 연산한다는 차이가 있다는것까진 이해했습니다. 강의에서는 주문취소를 할때, order 에 orderItem 들을 취소처리하던데, 그럼 N+1 문제가 발생하지 않나요? 1개의 Order 에 OrderItem 이 N개면 추가적으로 쿼리를 계속 호출하는걸로 이해했습니다. 1번방법은 N+1 문제를 피할수있지만 모델에 비즈니스로직을 작성하지 못하고, 2번방법은 모델에 비즈니스로직을 작성할수있지만 N+1 문제가 발생하는걸로 이해했는데 맞을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 save 메서드는 Optional<Member> 로 리턴하지 않는 이유가 궁금해서 이렇게 추측해봤는데 봐주시면 감사하겠습니다. 컴파일러가 save(파라미터) 에서 파라미터가 null인 것을 잡아서 오류라고 알려주기에 파라미터는 절대 null 값이 들어올 수 없어서 파라미터를 그대로 리턴하는 save 함수의 리턴타입은 Optional을 사용할 필요가 없다고 생각했습니다
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 찾지 못했습니다 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] entity의 id타입이랑 MemberJpaRepository클래스에서 public Member find(Long id){} 시그니처에도 Long wrapper class를 사용하셨는데! 그 이유가 있을까요?
Pk값으로 조회하는 메서드를 MemberRepository 에 생성하였습니다. public interface MemberRepository extends JpaRepository<Member,Long> { List<Member> findListById(Long id);} 그 다음 같은 PK값으로 조회하는 테스트를 만들었습니다. @Test public void returnType(){ Member aaa = new Member("AAA", 10); Member bbb = new Member("BBB", 20); memberRepository.save(aaa); memberRepository.save(bbb); List<Member> listById1 = memberRepository.findListById(0L); List<Member> listById2 = memberRepository.findListById(0L); } 저는 같은 트랜잭션에서 영속성컨테스트에 같은 PK를 조회하니까 쿼리가 한번만(초기 조회만) 나간다고 생각이 들었는데 2번 나가는것을 확인했습니다. findListById 및 다른 스프링데이터 JPA를 통한 메서드는 메서드를 호출할때마다 내부적으로 em.flush(), em.clear(), em.close를 자체적으로 하는 건가요?? 답변주시면 정말 감사하겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 첫번째 로드맵을 수강하고 JPA 로 넘어온 수강자 입니다. 예전 강의에서는 application.properties 을 사용하였고 현재 강의는 application.yml 을 사용 중인데 현업에선 어떤 걸 더 자주 사용하나요 ? 검색을 해보니 작성해야할 부분이 많거나 계층 구조로 보기편하게 하기 위해선 yml 을 사용한다고 명시되어있는데 현업에서는 어떤 걸 더 자주 쓰는지 궁금해서 질문드립니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. DTO로 변환을 해줬는데 왜 이러한 문제점이 발생하는지 잘 모르겠습니다. 감사합니다. [OrderDto] [log] 소스압축파일 https://drive.google.com/file/d/1Kb9yLRF3-AkxyBlvC8Aum_3gumKI21Ol/view?usp=sharing
안녕하세요, 강의 내용중 질문이 있어 질문 드립니다. PDF 13~14 쪽에 있는, MemberRepositoryTest 파일을 보면, Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보 장 이라고 나와 있습니다. 해당 테스트를 통과 하는데 있어서는 문제가 없지만, 이는 정확히 말해서 동일성이 보장 된게 아니라, 동등성이 보장 되어야 하는거 아닌가요? 그리고 테스트 중간에 @Test @Transactional @Rollback(false) public void testMember(){ Member member = new Member(); member.setName("memberA"); memberRepository.save(member); em.flush(); em.clear(); Member findMember = memberRepository.findOne(member.getId()); Assertions.assertThat(findMember).isEqualTo(member); } 이것과 같이 진행하면 false 가 나옵니다. Member.class 를 @Entity @Data @EqualsAndHashCode(onlyExplicitlyIncluded =true) public class Member { @Id @GeneratedValue @Column(name="member_id") @EqualsAndHashCode.Include private Long id; @NotEmpty //-->@valid로 체크 private String name; @Embedded //@Embadable.... private Address address; @JsonIgnore // 양방향 참조시에 한쪽에 해줘야함 그래서 연쇄 호출안함 @OneToMany(mappedBy = "member") //읽기만 가능 private List<Order> orders = new ArrayList<>(); } 이렇게 고치니까 통과가 되었습니다. 질문 정리 1) .isEqualsTo 는 동일성이 아닌 동등성 보장인가요? 2) @Data를 사용했다고 해서, equals, hashCode가 정확하게 작동하지 않을때도 있나요?