묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
em.detach(entity) 에 대해 질문 있습니다.
em.detach(entity) 을 할 경우 영속성 컨텍스트의 1차 캐시에서 entity도 날라가고 쓰기 지연 저장소에 저장되어 있던 entity에 의해 발생한 변경 관련 쿼리문도 삭제 되는건가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa에서 쿼리 보내는 시점에 대해 질문 있습니다.
수정, 삭제, 삽입 같은 경우에는 데이터 변경이라 영속성 컨텍스트의 쓰기 저장소에 보관되어 있다가 커밋 직전에 한번에 보내지는 반면 em.find()를 통해 발생하는 조회 쿼리는 find() 사용시 바로 디비에 전송이 되는건지 궁금합니다.em.find()를 통해 발생한 조회 쿼리는 트랜잭션 커밋 종료에 상관없이 디비에 바로바로 전송이 되는건지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
테스트 코드 문의
DTO 쿼리 작성 시 join fetch로 작성하는 경우는 에러가 발생하고 join으로 작성하는 경우에는 에러가 발생하지 않았는데요. join fetch의 개념은 결국 지연로딩을 작동시키지 않고 한 번에 연관된 것들 다 가져온다는 것인데 왜 여기선 안 되는 것인지 궁금합니다.엔티티 @Query문하고 DTO @Query 테스트 코드를 돌렸는데 서로 영향을 미쳐 테스트가 실패라고 뜹니다. @Transactional을 붙여 롤백이 되게끔 하여 해결은 했지만 궁금한 점이 있습니다. 스프링 데이터 JPA 테스트를 돌릴 때 @SpringBootTest 어노테이션 붙이면 자동으로 롤백이 되는 것이 아닌가요?package study.springdatajpa.repository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.springdatajpa.domain.Member; import study.springdatajpa.domain.Team; import study.springdatajpa.dto.MemberDto; import java.util.List; @SpringBootTest class MemberRepositoryTest { @Autowired private MemberRepository memberRepository; @Autowired private TeamRepository teamRepository; @Test @Transactional void testQuery() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findUser("AAA", 10); Assertions.assertThat(result.get(0)).isEqualTo(m1); } @Test @Transactional void testDtoQuery() { Team team = new Team("teamA"); teamRepository.save(team); Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); m1.setTeam(team); m2.setTeam(team); memberRepository.save(m1); memberRepository.save(m2); List<MemberDto> dtoList = memberRepository.findUserDto(); Assertions.assertThat(dtoList.size()).isEqualTo(2); } }
-
미해결실전! 스프링 데이터 JPA
양방향 매핑 제거시 - fetch join/enityGraph
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 모르겠습니다..ㅜㅜ 안보이더라고요3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/[질문 내용]강사님 fetch join과 entityGraph에 대해서 공부를 해서, 연관된 객체에 대해서 가져올때, fetch join을 통해서 한방에 가져오는 법을 배웠는데, 만약 양방향 매핑을 풀고, 단방향 매핑으로 코드를 작성하려고 하는데, @Data @NoArgsConstructor @Entity(name ="team") public class TeamJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="team_id") private Long id; private String name; @OneToMany(mappedBy = "myTeamId") private List<MemberJpaEntity> memberJpaEntityList = new ArrayList<>(); } ---------- @Data @NoArgsConstructor @Entity(name = "user") public class MemberJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="user_id") private Long id; private String name; @Column(name = "team_id") private Long myTeamId; }일때, 양방향 매핑을 끊어서, 단반향 매핑만 되게끔 수정을 했는데, 이렇게 되면 패치조인을 못 하지않나여? 궁금해서 질문을 올립니다...ㅜ 순환참조를 삭제하려고 없애고, TeamJpaRepository.findById(teamId)로 팀이 필요할때 조회할 수 있게 만들었는데, 한방으로는 못 가져오나여?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Run JpashopApplication 시간 초과
안녕하세요, 마지막 커리큘럼 웹계층 강의를 따라하면서 JpashopApplication.main()을 실행시켰는데 5분이 지나도 계속 실행중이고 콘솔도 어느 지점에서 멈춰서 해결방법 질문드립니다.https://drive.google.com/file/d/1vK3NAMKt6E7nTU69Rb0F6qELZEF3pCwU/view?usp=drive_link -실행 중지시키면 아래와 같이 뜨는데 제가 빨간색 강조해놓은 부분이 원인일까요? Execution failed for task ':JpashopApplication.main()'.> Build cancelled while executing task ':JpashopApplication.main()'* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 5m 56s3 actionable tasks: 2 executed, 1 up-to-date
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL(Querydsl) orderby 에 집계함수
영한님 안녕하세요강의 잘 듣고 있는데, 서브쿼리를 사용하려다.. where, having절에만 사용가능하기에 이 문제를 어떻게 해결할까 고민하다가 질문드립니다.. <문제>현재 엔티티는Post(게시글) 엔티티 필드 : postId, content, createdAt , 조회수,댓글 수, 좋아요 수Post view(게시글 조회) 엔티티 필드 : postViewId, user,post, 조회수,댓글수,좋아요수이렇게 있습니다. ( post view 엔티티는 특정 유저그룹이 어떤 게시글을 본 히스토리를 관리하고 그 히스토리를 통해 게시글의 인기도를 측정하기 위함입니다.)이러한 상황에서 ,게시글의 조회수, 댓글 수, 좋아요 수, 특정 유저그룹이 해당 게시글을 조회한 수, 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수 로 정렬하고, (where 조건 절은 다 구현됐다는 가정)groupby는 게시글의 pk 로만 하지만, 실제로 dto에 projections.bean()활용해서 매핑할 필드들은 content, createdAt 등 여러가지 컬럼이 추가로 있습니다. 이러한 경우라면, 우선 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수로 정렬하려면, 집계함수 sum을 활용해야하기 때문에 orderby절에 집계함수가 써야하고, 그러면 당연히 groupby를 써야하는데 이 때, post의 모든 필드들로 groupby 하는 것보다 pk로만 group by하는게 의미 있다고 생각해서 select 절에는 select postId 만 올 수 있을텐데그렇다면 이 postId의 리스트를 받아서 다시 이 postId로 다시 post entity를 조회해서 나머지 content, createdAt 값을 받는것이 최선일까요?(이 방법도 그런데 정렬이 유지되지않아서 결국 다시 집계함수로 정렬해야만할까요?) 이렇게 하면 두 번 쿼리를 날리기 때문에 별로 좋지 않은 방법이지 않을까라는 생각이 들지만 jpa는 from 절 서브쿼리를 지원하지않고, 다른 방법이 떠오르지 않아 여쭤봅니다. 조금 중구난방으로 질문한 감이 없지 않아 있지만..영한님 답변 부탁드립니다..ㅠㅠ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
19강 질문
1. 유저 컨트롤러에서 jdbc를 설정해준적이 없다고 하셨는데 여기서 jdbc클래스설정 이라는게 무슨말인가요?jdbc에 대한 생성자를 말하는건가오?생성자를 설정안해 줘서 탬플릿을 설정안해준거라면 userservice나 userRepositry 모두 다 템플릿에 대해 설정 안해줬는데 저 둘은 스프링빈도 아닌데 어떻게 jdbc템플릿 가져온건가요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입과 불변객체
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 임베디드 타입과 그 후 강의 값 타입과 불변 객체를 들으면서 궁금증이 생겨 게시판에 올립니다. 임베디드 타입에서 엔티티를 가질 수도 있다고 되어있는데 임베디드 타입의 역할은 단순한 값을 나타내기 위한 용도로 불변 객체로 설계되어야한다고 배웠습니다(다음 강의). 근데 만약 임베디드 타입안에 엔티티를 넣으면 불변 객체의 특성이 깨지는거 아닌가요...? 만약 엔티티를 넣으려면 엔티티 또한 수정자를 제거해서 불변 객체로 만들어야할거 같은데 이렇게 설계를 하는 이유를 정확히 감이 잡히지 않습니다(임베디드 타입안에 엔티티를 넣으면 좋은 이점 등을 모르겠습니다). 또한 임베디드 타입 안에 엔티티를 넣는 예제를 따로 생각해도 떠오르지 않네요.. 실무에서 이런 경우가 많이 있나요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계가 있는 엔티티 save 시 영속성 관련 질문입니다.
save를 통해 A라는 엔티티를 하나 저장하려고 합니다.그 엔티티는 ManyToOne으로 B라는 엔티티와 연관관계를 맺고 있습니다.A를 save할 때, B는 영속성 컨텍스트에 있어야 하는 상태인가요?
-
미해결실전! Querydsl
Querydsl gradle 파일 질문
안녕하세요 스프링부터 3.x 버전대 이상 그래들 설정에서clean {delete file('src/main/generated')} 요부분 은 먼 기능이고 왜넣은건지 궁금합니다! 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderServiceTest 실패
OrderServiceTest에서 assertEquals("주문 가격은 가격 * 수량이다")에서 실패가 뜨는데 원인을 찾기 어려워 질문 드립니다. 26000원이 나와야 하는데 0원이 나와서.. 총 가격을 구하는 for문이 안 돌아갔나 싶은데 코드에 오류는 없는 것 같아서 원인을 찾기 어렵습니다. https://drive.google.com/file/d/1SSJFsd6F2hikp7T3MONt5QvklxY-EX3B/view?usp=sharing
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Batch size의 작동 순서가 궁금합니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]프록시 부분도 있어 조금 복합적이긴 한데 Batch size의 작동 순서가 궁금합니다. 제가 이해하기로는 예를 들어 수업과 같이 Member 엔티티는 public class Member { @Id @GeneratedValue private Long id; private String name; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") Team team; }Team 엔티티는 public class Team { @Id @GeneratedValue private Long id; private String name; @BatchSize(size = 100) @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); }위와 같다고 할때select t from Team t해당 JPQL로 Team 엔티티들을 조회한다면 t.members의 객체들은 프록시로 존재하여 id 값만을 가지게 되고for (Team result : resultList) { System.out.println("result = " + result.getMembers().size()); for (Member member : result.getMembers()) { System.out.println("member = " + member); } }이 처럼 실행하면서 result.getMembers()가 처음 호출 될때select m1_0.TEAM_ID, m1_0.id, m1_0.age, m1_0.name from Member m1_0 where m1_0.TEAM_ID in (?, ?...)다음과 같은 쿼리를 호출해 Member 프록시들의 target에 알맞게 주입 해주게 되나요? 이 부분이 궁금하여 질문 드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional이 필요한곳과 필요없는곳
안녕하세요 service 관련 코드를 공부하다가 질문이 생겨서 문의드립니다.제가 지금까지 봤던 코드들은 @Transactional(readOnly = true) 는 Read할 때 사용을 하고 @Transactional은 Read를 제외한 CUD일 때 사용을 한다고 알고있는데, 인터넷을 찾아보니 "모든 CUD 관련 코드에 @Transactional을 무분별하게 사용하면 성능에 저하가 올 수 있다. 트랜잭션은 묶음의 처리입니다. 단건의 INSERT, DELETE, UPDATE 는 Transaction 이 필요하지 않습니다." 라고 블로그에서 보았습니다. 모든 CUD 관련 코드에다가 @Transactional을 붙이면 안되는건가요? 또한 @Transactional(readOnly = true) 는 Read 관련 코드에 붙이는게 필수는 아닌가요? 어떤 방식으로 코드를 짜는게 좋은 코드인지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
findBy 로 조회 시에, 조회 조건으로 PK vs Unique 제약조건 컬럼
테이블은 한 게시글 당 게시글 이미지를 여러 개 저장할 수 있도록 하는 postImage 테이블이고pk는 autoincrement인 Long 타입 postImageId입니다.그리고 unique한 조건은 @ManyToOne으로 매핑된 post(not null)와 imageUrl(not null) 컬럼의 조합입니다.이 때, postImage 엔티티를 조회하기 위해서는 pk인 postImageId로 조회하는게 좋을까요? 아니면unique 제약조건인 post+imageUrl로 조회하는게 좋을까요?실무에서 더 선호되는 방식이나 성능적, 설계적으로 좋은 방식이 궁금합니다
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
mutableListOf
강의를 들으면서 코틀린 문법도 같이 병행하면서 듣고있는데 이부분 질문을 하고 싶습니다!mutableListOf 로 감싸줘서 넣어져야지 코드가 오류 없이 되는지 궁금합니다. jpa 특성상 그런건가용?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Team 클래스에서 member를 List로 저장하는 이유
안녕하세요 강의 잘 보고있습니다!다름아니라 Member 클래스에서는 List를 쓰지않고 Team team으로 객체를 저장하셨는데Team 클래스에서는 List를 사용하여 member를 저장하는 이유가 궁금합니다.팀이 1이고 멤버가 N이여서 팀에 여러명의 멤버가 들어갈 수 있으므로 List를 사용하신걸까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
한 부모테이블에 속한 자식 테이블들의 칼럼이 전부 NOT NULL일 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Item 부모 클래스를 Album , Book , Movie 자식 클래스들이 상속받는 상황에서 해당 자식 테이블들 칼럼들이 전부 NOT NULL일 경우 단일 테이블 전략을 쓰고 데이터를 삽입할 경우 다른 자식 객체에 값에 NULL이 들어감으로써 NOT NULL 조건을 위배하여 오류가 발생즉 이럴 경우 JOINED 전략을 통해 칼럼들이 NOT NULL이어도 테이블이 자식 별로 분리돼서 생성됨에 따라 NOT NULL 조건을 위반하지 않고 원활하게 삽입될 수 있습니다.[핵심 질문]하지만 규모가 크지 않은 프로젝트에서 선생님께서는 단일 테이블 전략이 좋다고 하셨는데, 규모가 크지 않은 프로젝트에서라도 일반적으로 칼럼들이 NOT NULL로 설정되는 경우가 많은데 이런 경우에는 불가피하게 무조건적으로 조인 전략(JOINED)을 채택해야하는지 여쭙고 싶습니다 !
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트가 제공하는 임베디드 DB DataSource 스프링 빈 자동 등록 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.H2 DB는 자바로 만들어져 있고, 덕분에 JVM 내부에서 동작하는 임베디드 모드를 지원한다고 이해했습니다.스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용(제공)한다고 하는데..질문: 그렇다면 스프링 부트가 DataSource를 스프링 빈으로 자동 등록 시 라이브러리(의존 관계)에서 H2가 있는지를 먼저 확인하고, 별도의 설정(application.properties 내 url, username 등)이 없으면 임베디드 모드로 DataSource를 생성하여 빈으로 등록하는 건가요? 아니면 application.properties를 먼저 확인하고 url이 없으면 -> 라이브러리에 H2가 있는지 확인 후 메모리 DB를 사용하는 DataSource를 생성하여 빈으로 등록하는 건가요? 만약 후자라면 왜 그렇게 설계했을지(이점?)도 궁금합니다.. 감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
즉시 로딩 상황에서 select문 호출에 대해 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Member 클래스의 team이 즉시 로딩으로 설정된 상황에서 아래 코드와 같이 실행 했을 때, team 엔티티의 select문이 한번 밖에 호출 되지 않습니다.저는 member 엔티티를 다 순회하면서 select문을 호출 할 것으로 예상했는데, 이 경우는 어짜피 각 member들의 team이 모두 같기 때문에 JPA에서 알아서 해당 team만 호출 하는 것인가요? 이부분이 궁금하여 질문 드립니다.Team team = new Team(); team.setName("Team 1"); em.persist(team); Team team2 = new Team(); team2.setName("Team 2"); em.persist(team2); Member member = new Member(); member.setUsername("user1"); member.setTeam(team); em.persist(member); Member member2 = new Member(); member2.setUsername("user2"); member2.setTeam(team); em.persist(member2); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); tx.commit();
-
미해결
스프링 알림 1:N 발송 어떻게 구현해야할까요?
안녕하세요. 스프링으로 알림 서비스 API 만들어보고 있습니다.여기서 알림이라 하면, 인프런에서 '종 아이콘' 누르면 나오는 사이트 내부에 있는 알림입니다. 현재 Notification 테이블은 Member 테이블이 @ManyToOne으로 매핑되어있는 상태입니다.즉, 한 유저는 여러개의 알림을 가질 수 있습니다. 'OO님이 본인 게시글에 답글을 달았습니다'와 같은 1:1 알림 전송은 Notification insert가 댓글 달때 한번만 일어나므로 상관없지만, '스프링 핵심 원리 -기본편 강의에 새소식이 있어요!!'와 같은 1:N 알림을 보내려면, 스프링 핵심원리를 듣는 모든 수강생한테 알림을 보내야하니까, 수강생수만큼 Notification Insert가 나가야하잖아요??그러면 수강생 수가 100만명이면 Insert가 100만명 나가는건데, 너무 '비효율적'이고 'DB 공간 낭비'라고 생각되서요. 대규모 서비스에서 사용되는 좋은 방법 추천해주실 분 계신가요?인프런에서 1:N 알림은 어떤 방법을 쓰고 있을까요~?