inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

연관관계의 주인만 외래키를 관리할수 있다는 의미

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요. 연관관계 부분이 많이 헷갈리지만 확실히 알고 가고 싶어서 좀 더 공부하면서 알아보고 있다가 질문드릴게 있어서요..! 강의에서 연관관계의 주인만 외래키를 관리할수 있다는 의미에 대해서 코드로 제가 이해한 바가 맞는지 직접 확인해보았는데요. 연관관계의 주인만 setTeam()메서드 등을 통해 외래키를 추가 및 변경할 수 있고, 연관관계의 주인이 아닌쪽은 외래키를 참조해서 조회만 할수 있다. 예를들어, Team team = new Team(); em.persist(team); Member member1 = new Member(); Member member2 = new Member(); Member member3 = new Member(); member1.setTeam(team); // 이렇게 해야함 member2.setTeam(team); // 이렇게 해야함 em.persist(member1); em.persist(member2); em.persist(member3); team.getMembers().add(member3); // 이렇게만 하면, member3의 외래키(TEAM_ID)가 설정되지않음. // 즉 member3의 team필드는 여전히 null이다. List<Member> newMembers = new ArrayList<>(); Member member4 = new Member(); em.persist(member4); newMembers.add(member4); team.setMembers(newMembers); // 이렇게만 하면, member4의 외래키(TEAM_ID)가 설정되지않음. // 즉 member4의 team필드는 여전히 null이다 tx.commit(); //그래서 위와같이하면, 이 상태로 db에 저장된다고 해도, 이후에 team.getMembers()를 호출하면, 리스트안에 member1, member2만 있고 member3과 member4는 없다. 이렇게 이해하는게 맞을까요..? 항상 질문에 답해주셔서 정말 감사드립니다..!

  • java
  • jpa
오리쉐리 댓글 2 좋아요 0 조회수 175

다대다 관계 1:N, N:1 로 풀기

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 왜 주문과 상품은 1:N, N:1로 풀고, 카테고리와 상품은 풀지 않은 건가요? 둘 다 다대다 관계인데 어떤 의미가 있나요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
허준재 댓글 1 좋아요 0 조회수 172

오타 제보드립니다.

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] JPA 기본편 강의 pdf 파일 (10. 객체지향 쿼리 언어 p.57) 위 사진에서 화살표로 가리키고 있는 부분에 Team 엔티티의 별칭 t가 누락되었습니다..!

  • java
  • jpa
woodongle 댓글 1 좋아요 0 조회수 91

엔티티매니저가 각각의 저장소에서 final로 선언될 수 있는 이유

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티매니저가 각각의 저장소에서 final로 선언될 수 있는 이유가 궁금합니다. final의 경우 한 번 선언하면, 교체될 수 없는 것 아닌가요? 혹시 관련 자료와 함께 설명을 첨부 해주시면 너무 감사하겠습니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
류재열 댓글 2 좋아요 0 조회수 93

Inheritance strategy 바꿀 때 유의사항

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요! 강의를 보다가 궁금증이 생겨서 질문 남깁니다. @Inheritance(strategy = InheritanceType.JOINED) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 영한님께서 InheritanceType.JOINED 전략을 쓰다가 성능이 잘 안나온다 싶으면 InheritanceType.SINGLE_TABLE 만 바꾸면 구조를 다 바꿀 수 있는 것이 JPA의 장점이라고 했습니다. 근데 실제로 서버를 운영하고 있는 상황에서 저렇게 바꿔도 기존의 데이터와 테이블에 영향이 없는지 궁금합니다.

  • java
  • jpa
lmkn5342 댓글 1 좋아요 0 조회수 92

PageResponseDTO 질문이 있습니다.

미해결

코드로 배우는 React 19 with 스프링부트 API서버

package com.example.backend.mallapi.dto; import lombok.Builder; import lombok.Data; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @Data public class PageResponseDTO<E> { private List<E> dtoList; private List<Integer> pageNumList; private PageRequestDTO pageRequestDTO; private boolean prev, next; private int totalCount, prevPage, nextPage, totalPage, current; @Builder(builderMethodName = "withAll") public PageResponseDTO(List<E> dtoList, PageRequestDTO pageRequestDTO, long totalCount) { this.dtoList = dtoList; this.pageRequestDTO = pageRequestDTO; this.totalCount = (int)totalCount; int end = (int)(Math.ceil( pageRequestDTO.getPage() / 10.0 )) * 10; int start = end - 9; int last = (int)(Math.ceil((totalCount/(double)pageRequestDTO.getSize()))); end = end > last ? last: end; this.prev = start > 1;//1보다 크면 참 밑에 if문 실행. this.next = totalCount > end * pageRequestDTO.getSize(); this.pageNumList = IntStream.rangeClosed(start,end).boxed().collect(Collectors.toList()); // start부터 end까지 연속된 숫자 스트림(IntStream)을 생성 // rangeClosed(a, b): a부터 b까지 포함 // IntStream은 기본형 int 스트림이기 때문에, // 객체형 리스트(List<Integer>)로 변환하기 위해 .boxed()를 사용. // 스트림을 리스트로 변환하는 역할 if(prev) { this.prevPage = start -1; } if(next) { this.nextPage = end + 1; } this.totalPage = this.pageNumList.size(); this.current = pageRequestDTO.getPage(); } } 위에 코드를 옆에처럼 디버깅할려면( https://www.youtube.com/watch?v=OHrLRg150As ) 즉 step over로 사용도 하면서 한 줄 한 줄 씩 어떻게 실행되는 지 보고 싶은데 아래와 같이 에러가 나옵니다. 혹시 스프링부트를 사용하면 디버거 모드가 활성화가 안되나요? 아래 사진을 보시면 38번째 줄에 브레이크 포인트 표시 해놨고 우측 상단에 디버그 모드도 실행되어있는데 중앙에 네모박스처럼 step over 모드가 비활성화 되어있습니다. 한 줄 한줄씩 디버깅을 할려면 어떻게 해야하는지 궁금합니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
zzzzz 댓글 2 좋아요 0 조회수 120

jpa 1:N insert시 트랜잭션 오류

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Entity @Table(name = "tb_board") @NoArgsConstructor(access = AccessLevel.PUBLIC) @Getter @Setter public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BOARD_ID", columnDefinition = "BIGINT COMMENT '게시판ID'") private Long id; @Column(name = "BOARD_NM", nullable = false, unique = true, length = 100, columnDefinition = "VARCHAR(100) COMMENT '게시판명'") private String boardNm; @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private List<Article> articleList = new ArrayList<Article>(); @Builder private Board(Long boardId, String boardNm) { this.boardNm= boardNm; this.id = boardId; } public Board createBoard(Long boardId, String boardNm) { return Board.builder().boardId(boardId).boardNm(boardNm).build(); } public void addArticle(Article article) { this.articleList.add(article); } @Column(name="REG_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name="UPD_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; } @Entity @Table(name = "tb_article") @Builder @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ARTICLE_ID", columnDefinition = "BIGINT COMMENT '게시글ID'") private Long id; @Column(name = "ARTICLE_TITLE", columnDefinition = "VARCHAR(100) COMMENT '게시글제목'") private String title; @Column(name = "ARTICLE_CONTENT", columnDefinition = "VARCHAR(600) COMMENT '게시글내용'") private String content; @Column(name = "REG_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name = "UPD_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; @ManyToOne @JoinColumn(name = "BOARD_ID", nullable = false) private Board board; } @Transactional(rollbackFor = Exception.class) // 체크 예외도 롤백 public void saveArticle(Article article) { try { log.info("article",article.getTitle()); Long boardId = 13L; Board paramBoard = null; Optional<Board> rBoard = boardRepository.findById(boardId); if(rBoard.isPresent()) { paramBoard =rBoard.get(); }else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } Article paramArticle = Article.builder() .title(article.getTitle()) .content(article.getContent()) .regId("등록자") .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .board(paramBoard) .updId("수정자") .build(); if(paramBoard.getArticleList() == null) { List<Article> articles =new ArrayList<Article>(); articles.add(paramArticle); paramBoard.setArticleList(articles); }else { paramBoard.getArticleList().add(paramArticle); } boardRepository.save(paramBoard); }catch(Exception ex) { log.error("Error saving article", ex); throw ex; } } else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } 여기서 save를 돌떄 org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.backend.com.entity.Board#13] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:325) ~[spring-orm-6.2.2.jar:6.2.2] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) ~[spring-orm-6.2.2.jar:6.2.2] 요런식으로 뜨는데 public interface BoardRepository extends JpaRepository<Board, Long>, QuerydslPredicateExecutor<Board> { Optional<Board> findById(Long boardId); } querydsl과 jpa같이 사용하고싶어서 요렇게 셋팅하고 공부중입니다. 해본 방법 boardRepository.save(paramBoard) 부분을 빼고 마지막 boardRepository.save(paramBoard); 만 돌려봤지만 마찬가지 에러가 발생했었고 혹시 table 쪽에 lock이 걸려있나 싶어서 보니 lock도 없었음 3. 지피티 한테 물어보니깐 @Lock(LockModeType.PESSIMISTIC_WRITE) 쓰라고 해서 save쪽에 넣어봄 . 마찬가지 .. Board쪽에 @Version @Column(name = "version") private Long version; 을 추가하라고 해서 추가해봐도 마찬가지 .. 이유는 "Row was updated or deleted by another transaction" 오류는 동시에 여러 트랜잭션에서 동일한 데이터를 수정하거나 삭제할 때 발생할 수 있습니다. 즉, 한 트랜잭션에서 데이터를 수정하는 동안 다른 트랜잭션에서 동일한 데이터를 수정하거나 삭제했기 때문에 충돌이 발생하는 것 이라는데 잘 모르겠습니다 뭐가 문제일까요 .

  • spring
  • 웹앱
  • spring-boot
  • jpa
blossom_mind 댓글 2 좋아요 0 조회수 121

상품 엔티티 관련하여 질문 드립니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

제공 해주신 코드에서 ITEM에는 왜 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 이거에 해당하는 코드가 없을까요? @OneToMany(mappedBy = "item", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 이런 코드가 있어야 1대 다 관계에서 매핑과 주인관계를 결정해줄 수 있지 않나요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
류재열 댓글 1 좋아요 0 조회수 87

일대다 페치 조인 데이터 뻥튀기

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의에서 컬렉션을 페치 조인했을때 컬렉션의 요소 만큼 결과 리스트가 증가한다 하였습니다. 하지만 아래와 같이 코드를 실행했는데 결과는 한번만 출력이 됩니다. 찾아보니 JPA에서 내부적으로 중복을 없애준다는데 맞는 이야기 인가요?? package jpashop.jpql; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; import java.util.List; public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); //트랜잭션 생성 EntityTransaction tx = em.getTransaction(); //트랜잭션 시작 tx.begin(); try { Team teamA=new Team(); teamA.setName("팀A"); em.persist(teamA); Team teamB=new Team(); teamB.setName("팀B"); em.persist(teamB); Member member1=new Member(); member1.setUsername("member1"); member1.setAge(10); member1.setTeam(teamA); em.persist(member1); Member member2=new Member(); member2.setUsername("member2"); member2.setTeam(teamA); member2.setAge(15); em.persist(member2); Member member3=new Member(); member3.setUsername("member3"); member3.setTeam(teamB); member3.setAge(20); em.persist(member3); em.flush(); em.clear(); String query="select t From Team t join fetch t.members where t.name='팀A'"; List<Team> result = em.createQuery(query, Team.class) .getResultList(); for (Team t:result){ System.out.println("member= " +t.getName()+"|members="+t.getMembers().size()); for (Member m:t.getMembers()){ System.out.println("- member ="+m); } } tx.commit(); }catch (Exception e){ e.printStackTrace(); tx.rollback(); }finally { em.close(); } emf.close(); } } String query= "select t From Team t join fetch t.members" ; String query= "select t From Team t" ; 두 결과 사이즈를 찍어도 동일하게 2가 나옵니다.

  • java
  • jpa
큐펀치 댓글 1 좋아요 1 조회수 280

JUnit4, JUnit5 충돌 문제

미해결

실전! 스프링 데이터 JPA

강의 : 스프링 데이터 JPA와 DB 설정, 동작확인 7분 20초 환경설정시에 //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } 를 추가하라고 하셔서 추가했는데, 이 강의에서는 Junit5로 설정하라고 하셔서요.. 그럼 import할때 오류가 나는데 어떻게 해야할까요?

  • java
  • spring
  • spring-boot
  • jpa
kaa08 댓글 2 좋아요 0 조회수 235

product image

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요 강의를 기반으로 작업을 하다 궁금한점이 생겨서 product - modify에서 사진을 모두 삭제하고 저장을 해두거나 product - register에서 사진이 없는상태로 저장을 해두면 @Query("select p, pi from Product p left join p.imageList pi where pi.ord = 0 and p.delFlag = false ") Page<Object[]> selectList(Pageable pageable); ProductRepository에서 selectList 쿼리부분의 ord = 0인 설정만 만 호출하게 되버리는데 이때 이미지리스트 테이블에서 이미 ord가 없는 게시물은 조회가 되지 않습니다.. ord가 이미 없는 게시물은 delFlag가 false임에도 조회가 되지않습니다... 강의 목표는 아마도 default.jpeg 가 나와야 정상인거같은데 어떻게 해야 좋을까요 ? 처음엔 서비스에서 imageStr이 없으니 imageStr을 강제로 default.jpeg로 설정해봤지만 어차피 조회되지 않아서 의미가 없었습니다. 쿼리를 수정해봐야 할까요 ..??

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
이동준 이 댓글 2 좋아요 0 조회수 93

MemberRepositoryTest 실행시 오류가 발생합니다

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

https://drive.google.com/file/d/1xCfH-VjJWp4I252km26K5kFyBZNY3ZaS/view?usp=sharing junit4는 assertThat을 지원하지 않는다고 하여 junit5로 하고 실행하였더니 h2데이터베이스 연결문제가 발생하는 것 같습니다. h2는 정상적으로 설치하여 잘 작동됩니다. 어디가 문제일까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
sws6054 댓글 2 좋아요 0 조회수 464

연관관계의 관점

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 회원-주문 관계에서 하나의 회원은 여러 주문을 할수있어서 1:N이라 하셨는데 서버 관점에서 보면 여러 회원이 존재하기 때문에 N:M으로 설계해야 하지 않을까요?? 고객 한명당 트랜잭션 관점으로 설계를 해야하는건지 기준이 따로 있는지 궁금합니다..

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
큐펀치 댓글 1 좋아요 0 조회수 89

스프링부트 구동에러 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl

미해결

스프링 DB 2편 - 데이터 접근 활용 기술

실습소스를 스프링부트 3버전에서 진행중입니다. 아래와 같은 오류가 스프링부트 구동중에 발생하는데요. 서버구동은 잘 진행되나 Exception로그가 출력됩니다. 테스트는 잘 통과됩니다. java.lang.Exception: exception just for purpose of providing stack trace at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:309) ~[hibernate-core-6.6.5.Final.jar:6.6.5.Final] at org.hibernate.internal.AbstractSharedSessionContract.buildNamedQuery(AbstractSharedSessionContract.java:1141) ~[hibernate-core-6.6.5.Final.jar:6.6.5.Final] at org.hibernate.internal.AbstractSharedSessionContract.createNamedQuery(AbstractSharedSessionContract.java:1019) ~[hibernate-core-6.6.5.Final.jar:6.6.5.Final] at org.hibernate.internal.AbstractSharedSessionContract.createNamedQuery(AbstractSharedSessionContract.java:143) ~[hibernate-core-6.6.5.Final.jar:6.6.5.Final] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) ~[spring-orm-6.2.2.jar:6.2.2] at jdk.proxy3/jdk.proxy3.$Proxy117.createNamedQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.NamedQuery.hasNamedQuery(NamedQuery.java:114) ~[spring-data-jpa-3.4.2.jar:3.4.2] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.getCountQuery(JpaQueryLookupStrategy.java:208) ~[spring-data-jpa-3.4.2.jar:3.4.2] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:175) ~[spring-data-jpa-3.4.2.jar:3.4.2] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:256) ~[spring-data-jpa-3.4.2.jar:3.4.2] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:99) ~[spring-data-jpa-3.4.2.jar:3.4.2] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:116) ~[spring-data-commons-3.4.2.jar:3.4.2] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:104) ~[spring-data-commons-3.4.2.jar:3.4.2] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:92) ~[spring-data-commons-3.4.2.jar:3.4.2] at java.base/java.util.Optional.map(Optional.java:260) ~[na:na] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:92) ~[spring-data-commons-3.4.2.jar:3.4.2] at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:440) ~[spring-data-commons-3.4.2.jar:3.4.2] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSuppo ... 생략 어떤 부분에서 에러가 난 것인지 스택트레이스만 보고서 파악하기 어렵네요. AI인턴 도와주세요!

  • spring
  • mvc
  • jpa
  • querydsl
  • spring-data-mybatis
  • spring-jpa
창신동 장첸 댓글 1 좋아요 0 조회수 248

스프링부트3 버전으로 실습소스를 구동

미해결

스프링 DB 2편 - 데이터 접근 활용 기술

안녕하세요. 스프링부트3 버전으로 실습소스를 구동하려고 합니다. https://drive.google.com/drive/folders/1dXaF4sqO4De0_A3ECZT155dTUjH4--mn?usp=sharing (위 경로에서 프로젝트 소스를 확인하실 수 있습니다.) 구동결과 에러 로그 Parameter 0 of constructor in hello.itemservice.config.MyBatisConfig required a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' that could not be found. 위와 같은 에러가 발생합니다. 스프링버전 2일 때는 잘 구동되는 것을 확인했습니다. 도움 부탁드립니다ㅠㅠ

  • spring
  • mvc
  • jpa
  • querydsl
  • spring-data-mybatis
  • spring-jpa
창신동 장첸 댓글 3 좋아요 0 조회수 304

member.getTeam()과 team.getMember()에 대해 질문드립니다.

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요. member.getTeam()과 team.getMember()의 동작원리에 대해 이해가 되지않는 부분이 있어서, 구글링을 통해 아래와 같이 정리해보았는데 이렇게 이해하는게 맞을까요? member.getTeam() member.getTeam()을 호출하면, JPA는 내부적으로 MEMBER테이블에서 현재 member의 JoinColumn으로 명시했던 TEAM_ID값(=외래키값)을 가져와서 TEAM테이블의 기본키를 참조하여 해당 Team 데이터를 조회하고, Team 객체를 생성해서 반환한다. 1. member.getTeam()이 호출되면 내부적으로 MEMBER테이블에서 현재 member의 JoinColumn으로 명시했던 TEAM_ID값(=외래키값)을 가져온다. 2. Team테이블의 기본키가 이 외래키와 일치하는 Team 데이터를 찾는 SQL쿼리를 실행한다. 3. 조회된 데이터로 Team객체를 생성해서 반환한다. team.getMember() team.getMember()를 호출하면, JPA는 내부적으로 TEAM테이블에서 현재 team의 기본키값을 가져와서 MEMBER테이블의 외래키를 참조하여 해당 Member 데이터를 조회하고, Member객체를 생성해서 기존 비어있는 리스트에 추가한다. 1. team.getMember()가 호출되면 내부적으로 TEAM테이블에서 현재 team의 기본키값을 가져온다. 2. Member테이블의 외래키인 TEAM_ID가 이 기본키와 일치하는 Member 데이터를 찾는 SQL쿼리를 실행한다. ex) SELECT * FROM MEMBER WHERE TEAM_ID = 1; 3. 조회된 데이터로 Member객체를 생성해서 기존 비어있는 리스트에 추가한다.

  • java
  • jpa
오리쉐리 댓글 2 좋아요 0 조회수 145

멀티 스레드 트랜잭션

미해결

스프링 DB 2편 - 데이터 접근 활용 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 영한님 강의를 보고 사이드 프로젝트를 하며 성장 하고 있습니다. 관련된 내용을 찾아 보다가 인사이트를 얻기 어려워 조언을 얻고자 질문을 남깁니다. 테스트에 트랜잭션이 걸려있고, ExecutorService submit을 통해 단순히 데이터를 저장 할때 PessimisticLockingFailureException 예외가 발생 합니다. 테스트 트랜잭션이 락을 가지고 있고 커밋 되지 않아서 문제가 발생 한다고 하는데 멀티 스레드는 트랜잭션 전파와 연관이 없기 때문에 별도의 물리 트랜잭션이라고 생각 하고 있습니다. 하지만 왜 이런 예외가 발생 하는지 모르겠습니다 ㅠㅠ 힌트라도 알려 주시면 감사합니다 @Transactional @DisplayName("멀티 스레드에서 모임을 저장 한다.") @Test void saveEventWhenMultiThread() throws InterruptedException { //given ExecutorService executorService = Executors.newFixedThreadPool(2); int taskCount = 3; CountDownLatch countDownLatch = new CountDownLatch(taskCount); //when //then for(int i = 0; i < taskCount; i++) { int testNum = i; executorService.execute(() -> { try { eventRepository.save(createEvent("멀티 테스트" + testNum , "테스트 모임", 30)); } finally { countDownLatch.countDown(); } }); } countDownLatch.await(); executorService.shutdown(); } Exception in thread "pool-2-thread-2" Exception in thread "pool-2-thread-1" org.springframework.dao.PessimisticLockingFailureException:

  • spring
  • mvc
  • jpa
  • querydsl
  • spring-data-mybatis
  • spring-jpa
조희제 댓글 1 좋아요 0 조회수 112

logout 후에 login 페이지 이동은 어디서 시켜주는건가요?

미해결

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세 문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요. location.href = /api/logout 를 통해 스프링 시큐리티로 logout 보내고 세션 삭제한 뒤 브라우저를 보면 login?logout이 찍힌걸 확인 할 수 있는데 login으로 어디서 보내준건지 헷갈립니다..

  • vue.js
  • aws
  • spring-boot
  • jpa
  • spring-security
zzang4355 댓글 1 좋아요 0 조회수 279

조회 시 Entity를 뿌리는 것 아닌가요 ?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] view 계층과 주고 받을 때는 dto로 주고 받아야 하니 들어올 때 form을 사용했는데, 지금처럼 em.createQuery("select i from Item i", Item.class).getResultList(); 이런 repo 코드를 정제없이 그대로 return 해주는 경우 Entity를 직접 전달하고 있는 것 아닌가요 ?? 잘못 이해하고 있는 부분에 대해 짚어주시면 감사하겠습니다. 만약 잘 이해하고 있고, 예제라서 이렇게 처리한 것이라면, 정제하는 과정이 서비스 단에서 일어나는게 좋을까요 ? 컨트롤러 단에서 일어나는게 좋을까요 ?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 118

Querydsl Fetchjoin 해서 이미 조회한 엔티티를 Spring Data JPA findBy 다시 하면 영속성 컨텍스트에서 가져오지 않고 쿼리가 실행되는 문제

미해결

실전! Querydsl

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 강사님 안녕하세요. 프로젝트를 진행하다가 Querydsl의 fetcjoin을 쓰고, 로직 처리를 위해 엔티티를 따로 조회하기 위해 다음과 같이 코드를 짰는데, 중간에 for 문으로 c.getUser()했을 떄는 fetcjoin이 제대로 되어서 쿼리가 발생하지 않고, userId가 1인 UserEntity가 잘 조회됩니다. 그런데 이미 userId가 1인 user 엔티티가 조회 됐음에도 불구하고 맨 아래의 userId가 1인 User findBy를 사용하여 조회하면 select UserEntity where userId=1 인 한 번 더 쿼리가 발생합니다. 원래 fetcjoin는 엔티티.get연관엔티티() 에서만 작동을 하는 걸까요? for 문 돌면서 id 체크하고 c.getUser()로 재사용하기에는 비효율적일 것 같은데 지금과 같은 상황에서는 어떤 식으로 쿼리가 한 번더 발생하지 않으면서 동일한 이미 fetcjoin으로 가져온 엔티티를 사용할 수 있는 좋은 방법이 있는지 궁금합니다. fetcjoin 한 getPopUpStoreComments querydsl 코드는 위와 같습니다. 감사합니다.

  • java
  • jpa
jaesungyoun 댓글 1 좋아요 0 조회수 158

인기 태그

인프런 TOP Writers

주간 인기글