묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
제대로 이해했는지 확인하고싶습니다.
가장 처음에 했던 트랜잭션은 각각의 리포지터리에서 @Transactional을 걸어줘서 별도로 커밋, 롤백 되게끔 만들었습니다. 이후, 마지막에는 LogRepository에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용해서 트랜잭션 동기화 매니저에서 다른 커넥션을 가져와서 별도로 커밋, 롤백 되게끔 만들었습니다. 여기서 궁금한 점은 처음과 마지막의 트랜잭션의 구성은 다르지만 결과값은 똑같은 게 맞을까요? 다른 점이 있다면 혹시 무엇인지 알려주시면 감사하겠습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.원래는 service단에 @Transactional 을 걸어주는게 맞지만 지금은 강의하는거기때문에 JpaItemRepositoryV2에 @Transactional을 선언해준건가요 ?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
엔티티 설계 질문
JPA 엔티티 설계에 대한 질문입니다. 상품 엔티티가 있는데 상품을 구분하는 카테고리가 아래와 같이 2종류 있다고 가정하면상품 배송 카테고리 (직접배송, 퀵배송, 일반택배배송, 픽업가능) -> 1:N 가능상품 종류 카테고리 (명품, 의류, 전자제품 등등) -> 1:N 가능 어떻게 설계하는 게 좋을까요?상품 Entity상품 id상품이름배송 카테고리 리스트종류 카테고리 리스트=> 상품 테이블, 상품 배송 카테고리 테이블, 상품 종류 카테고리 테이블 (총 테이블 3개 생성됨) 상품 Entity상품 id상품이름카테고리 리스트 (배송 카테고리와 종류 카테고리를 한 리스트에 다 넣어놓음)=> 상품 테이블, 상품 카테고리 테이블 (총 테이블 2개 생성됨)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
bizException 테스트 코드에서 db에 save되는지 궁금합니다.
@Test void bizException() { //given Order order = new Order(); order.setUsername("잔고부족"); //when try { orderService.order(order); } catch (NotEnoughMoneyException e) { log.info("고객에게 잔고 부족을 알리고 별도의 계좌로 입금하도록 안내"); } //then Order findOrder = orderRepository.findById(order.getId()).get(); Assertions.assertThat(findOrder.getPayStatus()).isEqualTo("대기"); }@Transactional public void order(Order order) throws NotEnoughMoneyException { log.info("order 호출"); orderRepository.save(order); log.info("결제 프로세스 진입"); if (order.getUsername().equals("예외")) { log.info("시스템 예외 발생"); throw new RuntimeException("시스템 예외"); } else if (order.getUsername().equals("잔고부족")) { log.info("잔고 부족 비즈니스 예외 발생"); order.setPayStatus("대기"); throw new NotEnoughMoneyException("잔고가 부족합니다"); } else { log.info("정상 승인"); order.setPayStatus("완료"); } log.info("결제 프로세스 완료"); }예외가 터지는데 save의 insert쿼리가 나가는지 궁금합니다. 테스트 코드가 성공했고 (테스트코드) Order findOrder = orderRepository.findById(order.getId()).get(); 이 코드에서 findOrder이 성공적으로 가져왔습니다. 그러면 서비스 코드에서 orderRepository.save(order)이 성공적으로 커밋이 된건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
jpa 로그 정보 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]jpa 특징은 "persist" 메서드 호출 시 바로 insert 쿼리를 날리는 게 아니라 트랜잭션을 커밋하기 직전 flush 가 발생해서 insert 쿼리 로그가 뒤에 찍힌다고 설명해주셨습니다.(영상 기준 4:50 ~ 5:12) 저도 같은 테스트코드를 실행시켰으나 강의 영상과 다르게 중간에 insert 쿼리 로그가 남는 것을 확인했습니다. 영상 촬영시점보다 hibernate 버전이 업그레이드 되어 로그를 남기는 시점만 변경이 된 것일까요? 아니면 flush 시점 자체도 변경이 된 건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
5:14 rollbackOnly에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의 5:14분 내용에 대한 질문입니다. ‘rollbackOnly를 참고하지 않는다’는 말은,가장 바깥쪽에 있는 트랜잭션 AOP 프록시 객체(MemberService의 트랜잭션 AOP 프록시 객체)가 런타임 에러를 만나면어차피 트랜잭션 매니저에게 롤백 요청을 하기 때문에 rollbackOnly를 따로 참고하지 않아도 된다는 뜻인가요? 그렇다면, 만약 런타임 예외가 발생하지 않는 경우 rollbackOnly는 내부 트랜잭션 중 하나에서 임의로 롤백했을 때바깥쪽에서 이를 감지하는 용도로 사용되는 건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@PostConstruct와 @Transactional 빈 생명주기와 함께 순서를 정리해보고 싶습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]비슷한 질문과 답변을 많이 봤는데 한번 정리한 것을 확인 받고 싶습니다. 너무 많이 질문 받아 번거로우시겠지만 확인해주시면 감사합니다 스프링 빈의 이벤트 라이프사이클은 다음과 같았습니다스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 사용 -> 소멸전 콜백 -> 스프링 종료김영한님이 답변에서 정리해주신 말씀은 다음과 같습니다@PostConstruct는 해당 빈 자체만 생성되었다고 가정하고 호출된다. 해당 빈에 관련된 AOP등을 포함한, 전체 스프링 애플리케이션 컨텍스트가 초기화 된 것을 의미하지는 않습니다. 트랜잭션을 처리하는 AOP등은 스프링의 후 처리기(post processer)가 완전히 동작을 끝내서, 스프링 애플리케이션 컨텍스트의 초기화가 완료되어야 적용된다.이를 종합해서 일어나는 순서를 더 세분화 하면 다음과 같다고 생각합니다.스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 스프링의 후처리기 적용(트랜잭션 AOP 등 프록시 객체 생성) -> 후 처리가 완료된 후 빈 등록 -> 스프링 애플리케이션 컨텍스트의 초기화가 완료 되어 어플리케이션 실행-> 사용 -> 소멸전 콜백 -> 스프링 종료예제 코드에서 위처럼 hello 클래스 로그를 찍어보면 프록시 객체라고 나오는 이유는 해당 메서드가 실행되는 시점이 사용 시점에 해당하기 때문이다전체적인 내용이 맞을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
원본 클래스 인스턴스와 프록시 인스턴스 모두 힙 영역에 저장되는걸까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링에서 @Transactional을 사용하게 되면 원본 클래스자체의 인스턴스와 클래스의 프록시 객체의 인스턴스 모두 힙 영역에 생성되는데, 프록시 객체만 스프링 컨테이너에 등록되고, 프록시 객체가 클래스 원본 인스턴스 참조를 가진다 라고 이해하면 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2 실행 실패
테스트는 성공을 했는데 ItemServiceApplication을 실행했는데 실행이 되질 않습니다...제가 처음에 스프링부트는 3.x.x 버전을 사용하고 있는줄 알고 MyBatis 버전을 3.0.3으로 설정하고 "테스트 실행 도중" 오류가 생겼습니다.그래서 막 build.gradle에서 이것저것 건드리다가 강사님께서 올려주신 코드를 그대로 실행한걸 깨닫고 MyBatis 버전을 2.2.0으로 낮추고 다시 build.gradle을 원래대로 돌리니 테스트 코드가 정상 실행됐는데 이제는 애플리케이션 실행이 되질 않습니다 ㅠㅠ 뭐가 문제인걸까요..오류 코드는 아래와 같이 뜹니다..org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.ConnectException: Connection refused: localhost" [90067-200]제가 작성한 코드는 아래에 구글 드라이브 링크로 첨부하겠습니다.https://drive.google.com/file/d/1w5ys_ZxhtNr5-vgNq9-B_j1Y2CEkiktR/view?usp=sharing그리고 에러 메시지는 전부 붙여넣기 하려고 했는데 본문 글자수가 초과되서 실을수가 없어요...ㅠㅠ어떤게 문제인지 알려주시면 감사하겠습니다 ㅠㅠㅠMyBatis에서 갑자기 문제가 생겼어요....
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
db에 저장되는 이름과 객체를 지정하는 이름 스타일 차이는 그냥 관례일까요
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]db의 필드 이름은 item_name 이렇게 지정하고, 객체에서는 itemName이런 형식으로 camelCase 스타일로 지정하는 이유는 그냥 오랜 관례일까요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
강의 결제 했습니다!
믿고 듣는 김영한 강사님 강의! 최근에 구매한 김영한 강사님 강의 다 듣고 이것도 열심히 들을게요!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
TransactionManager 로깅 정보
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]DataSourceTransactionManager의 로그에는 사용되고 있는 커넥션의 정보(conn0)가 잘나오는데 JpaTransactionManager 에서는 커넥션 로그는 확인 못하나요 ?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
TransactionManager 주입
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 6:32 에서단순 테스트 코드이고 jpa 사용하지않았는데 JpaTransactionManager 가 주입 되는 이유는 먼가요 ?
-
미해결
QueryDSL 객체 로딩 후 DTO 변환시 재 로딩 하는 현상
class Game( .. @OneToMany(mappedBy = "gameId", cascade = [CascadeType.REMOVE], fetch = FetchType.LAZY) var missions: List<Mission> = mutableListOf(), @OneToMany(mappedBy = "gameId", cascade = [CascadeType.REMOVE], fetch = FetchType.LAZY) var rewards: List<Reward> = mutableListOf(), ){게임엔터티를 queryDSL 로 모두 가져온 후 class GameListResp( var missionTitle: String?, var rewardList: MutableList<RewardResp>, ) { constructor(model: Game) : this( missionTitle = model.missions.firstOrNull()?.let { MissionType.getTitle(it) }, rewardList =if(model.rewards.isNullOrEmpty()) mutableListOf() else model.rewards!!.map { RewardResp(it) }.toMutableList(), ) DTO 로 변환 하려고 할때미션과 리워드가 존재하지 않으면 select 쿼리가 나갑니다이 부분은 왜 그런걸까요 ?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
[해결방법] Could not autowire. No beans of 'ItemMapper' type found. 오류
아래 코드 추가@MapperScan("hello.itemservice.repository.mybatis") @Configuration @RequiredArgsConstructor @MapperScan("hello.itemservice.repository.mybatis") public class MyBatisConfig { private final ItemMapper itemMapper; @Bean public ItemService itemService() { return new ItemServiceV1(itemRepository()); } @Bean public ItemRepository itemRepository() { return new MyBatisItemRepository(itemMapper); } }
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
[해결방법] Invalid bound statement 오류
resources 폴더에서 폴더를 하나씩 생성해야합니다.한번에 폴더를 생성하면 오류가 발생합니다. (예: hello.iteamservice.repository.mybatis)강사님 만들어두신 프로젝트의 폴더를 복사 붙여넣기해도 오류가 발생합니다. 올바른 예시)hello 폴더 생성itemservice 폴더 생성repository 폴더 생성mybatis 폴더 생성ItemMapper.xml 파일 생성
-
미해결실전! Querydsl
스프링 테스트 실행이 안됩니다... 제발 도와주세요 ㅠㅠ
java : 21spring : 3.3.3 사용뭔가 제대로 빌드가 되지 않은 것 같아서 gradle 클린하고 재빌드하고 여러번 했는데도 반복적으로 오류 메세지가 발생합니다 ㅠㅠ영한쌤의 다른 자바 강의도 수강 중인데 그건 해당 경로에 있어도 실행이 잘되는데 특이하게 spring 프로젝트는 안되네요... 경로에 한글이 있어서 그런가 싶어 UTF-8 설정도 해두었습니다.얼른 수업 듣구 싶어욧,,, 도와주세요 ㅠㅠ
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
내부 트랜잭션 롤백시 마킹의 필요성
대원칙인 모든 논리 트랜잭션이 커밋되어야 모두가 커밋되는거고 하나라도 롤백되면 모두가 롤백된다는 개념에서 내부 트랜잭션이 롤백되면 그 시점에 모두 롤백시키면 되지 않나요? 굳이 내부 트랜잭션 롤백 후 물리 트랜잭션에 rollback_only마크를 달아 결국 모두가 롤백되도록 하는 이유가 궁금합니다.또 궁금한 점은 만약 개발자가 실수로 외부 트랜잭션을 먼저 롤백해버린다면 -> 제가 실험해보니 외부 트랜잭션 롤백시 물리 트랜잭션이 즉각 롤백이 되더라구요. 아마 isNewTransaction이 트루인 경우니 최종 결정권자의 형태로 바로 롤백을 시키는 것 같은데 그러고 나서 내부 트랜잭션 롤백을 시도하니까 여전히 롤백 마크를 남기는 로그가 뜨더라구요. 이 점에 대해서 설명 부탁드립니다:)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Deadlock 발생 관련 질문이 있습니다!!
[질문 내용]안녕하세요. 강의와 조금 다른 주제일 수 있으나 도움을 얻을 수 있지 않을까 하여 질문 남깁니다!!토이 프로젝트 진행중 사용자의 최근 접속시간을 주기적으로 업데이트 시킬 필요가 있어 Spring Security 인가 필터에서 현재 로그인한 유저의 최근 접속시간을 업데이트하는 쿼리를 날리도록 작성했습니다. 이 때 Deadlock이 발생하였습니다. 현재까지 제가 찾아본 바로는 DispatcherServelt 전에는 톰캣 스레드가 락을 점유하고 이후에는 IO 스레드가 락을 점유하여 그렇다는 정보를 찾을 수 있었는데요. 정확히 이해가 안가 여기에 여쭤봅니다 ㅠㅠ. 데드락이 발생하는 원인에 어떤것이 있을까요? 참고로 인가 필터에서는 jpa 리포지토리를 의존성 주입받아 사용해서 쿼리를 날렸습니다. (현재는 이 방법 자체가 데르락을 떠나 비효율적이라 판단하여 AOP로 해결한 상태입니다. 사실 이것도 효율적인 방법인지는 잘 모르겠습니다...)
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
JpaTransactionManager 사용할 경우 커넥션 로깅 질문
DataSourceTransactionManager의 로그에는 사용되고 있는 커넥션의 정보(ex. conn0)가 자세히 나오는데, JpaTransactionManager를 사용할 경우에는 위와 같이 몇번째 커넥션이 사용되고 있는지에 대한 정보가 잘 나오지 않는 것 같습니다. JPA를 사용할 경우, 위 사진과 같이 스레드가 커넥션 풀에서 어떤 커넥션을 가져오고 반환하는지를 알 수 있는 방법이 있는지 궁금합니다!