묻고 답해요
139만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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를 사용할 경우, 위 사진과 같이 스레드가 커넥션 풀에서 어떤 커넥션을 가져오고 반환하는지를 알 수 있는 방법이 있는지 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
build.gradle에 queryDSL 설정이 잘되지 않습니다.
plugins { id 'java' id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.1.5' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } //롬복 셋팅 configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'junit:junit:4.13.1' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.1' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5' implementation 'javax.persistence:javax.persistence-api:2.2' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' //test 롬복 testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() jvmArgs '-Xshare:off' // JVM 아규먼트 설정 } clean { delete file('src/main/generated') }이렇게 설정해둔 상태인데 gradle을 다시로드했음에도 other에 compilequerydsl 설정이 생기지 않는 상황이고, 다른방식으로 설정도 했었는데, 그때는 또 우측 gradle의 other에 compileQeurydsl 설정이 보여서 설정을 진행했고 프로젝트 generated 디렉토리가 생성되긴 했지만, generated 디렉토리 하위 파일들이 보이지 않습니다. 어떻게 해결할 수 있을까요? 커뮤니티의 내용들을 다 참고했지만 되지 않네요..
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
mybatis xml파일을 만드는중 sql문법 질문
[질문 내용]안녕하세요 열심히 강의를 듣던 중 MyBatis 적용1-기본 강의 11:37초 쯤에 and item_name...라는 sql구문을 쓰셨는데 이렇게 앞에 and가 들어가면select * from item where and item_name...이런 식으로 sql문이 쓰여지는거 아닌가요??앞에 and가 꼭 필요한건지 알아서 떼지는건지 궁금합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Q클래스 파일 생성 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]상황: build tool는 Gradle를 사용하고 있습니다.Gradle -> Tasks -> build -> clean Gradle -> Tasks -> other -> compileJava위에 작업을 실행해도 generated폴더에 Q클래스가 생성되지 않습니다. 참고로 generated도 생성되지 않습니다.다른 분들처럼 오류가 발생하지는 않습니다!!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
REQUIRES_NEW와 내부 호출
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]내부 호출 문제점은 REQUIRES_NEW 어노테이션이 적용된 경우에도 동일하게 발생하는 것 같은데 맞을까요?? 아래 코드를 실행했을 때 커밋이 한 번도 발생하지 않는 것을 로그로 확인했습니다. 혹시나 해서 여쭤봅니다!! @Slf4j @SpringBootTest public class InternalCallV1Test { @Autowired CallService callService; @Test void externalCall() { callService.external(); } @TestConfiguration static class InternalCallV1TestConfig { @Bean CallService callService() { return new CallService(); } } @Slf4j static class CallService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void internal() { log.info("call internal"); printTxInfo(); } @Transactional public void external() { log.info("call external"); printTxInfo(); this.internal(); throw new RuntimeException("종료"); } private void printTxInfo() { boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active={}", txActive); } } }