묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
intelliJ 버전
안녕하세요. spring 강의를 처음 들어보기 위해 java11과 intelliJ를 깔고 있습니다.java11까지는 깔았는데, 찾다보니 intelliJ 3.x 를 하려면 java17을 깔아야 한다는 글을 보아서요...spring 을 해보려면, 꼭 intelliJ 2.x를 깔아야 할까요? 아니면 그냥 3.x를 깔아도 될까요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
아마존 리눅스 2023 el9 버전 mysql 설치 중 KEY 오류
아마존 리눅스 2023으로 인스턴스를 사용했을 때 지면님과 강사님께서 알려준 el9 버전 레포지토리를 사용하는 명령어sudo dnf install <https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm> sudo dnf install mysql-community-server 이렇게 하여도 저는 계속 sudo dnf install mysql-community-server 해당 명령어를 통해 설치하려고 하면The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.이런 오류가 발생하였습니다.계속 키가 옳지 않다는 오류가 생겼고 챗지피티랑 구글링을 통해 이것저것 해보다가sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 sudo yum update 위의 두 명령어를 실행하고sudo dnf install mysql-community-server해당 명령어로 재설치 해주니 제대로 설치가 되었습니다!제 추측으로는 KEY를 다시 받아오고 yum update 하는 과정이 필요했던 것 같습니다! 저와 같은 오류를 가지는 분들에게 도움이 되었으면 좋겠네요...!!!
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
여전히 타겟을 찾을 수 없습니다..
강의와 같은 버전으로 모두 같게 진행하지 않아서 그런지..windows 타겟을 찾을 수가 없습니다.전에 AI가 알려준 건 도움이 되질 않았어요분명 prometheus 타겟은 잡힌 것으로 봐서는 app 폴더 내부로 들어가서 prometheus.yml 파일도 잘 읽은 것 같은데요..왜 그대ㅑ로 아래에 job_name이 windows인 것은 왜 설정이 안 되는지 모르겠습니다..
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
merge 질문이 있습니다.
안녕하세요 영한님! 강의를 듣던 중 궁금한 점이 생겨서 질문 남깁니다. 프로젝트를 진행하며 Spring Data JPA를 사용하면서 Entity를 update 하는 방법에 대해서 고민이 생겼습니다.findById를 한 후 save() 메서드를 호출하는 방법과public Post updatePost(long postId, PostUpdateRequest request) { Post post = findById(postId); post.update(request.getTitle(), request.getContent()); return postRepository.save(post); } 영한님이 말씀하신 dirty checking 을 이용하는 방법 중 어떤게 더 나은 방법인지 궁금해서요.@Transactional public void updatePost(long postId, PostUpdateRequest request) { Post post = findById(postId); post.update(request.getTitle(), request.getContent()); } spring data jpa 의 save() 메서드의 경우 새로운 엔티티일땐 em.persist()존재하는 엔티티일땐 em.merge() 방식으로 동작한다고 알고 있습니다. findById를 통해 엔티티를 조회해서 영속상태로 만든 후 em.merge를 하게 된다면 dirty checking을 통해 엔티티를 update하는 것과 어떤 차이가 있는건지 궁금합니다. @Transactional을 사용해서 리소스를 사용하는것 보단, save 메서드 호출을 통해 em.merge()를 사용하는게 더 나은 방법이 아닌지,혹은 update 하는 동안의 트랜잭션은 큰 리소스 사용 없이 동작하기 때문에 dirty checking을 사용하라고 하신 것인지 궁금합니다!
-
해결됨스프링 핵심 원리 - 기본편
스프링 빈 조회 질문입니다
스프링 빈 조회할때 검증할때 isInstanceOf로 타입 비교를 할 때 느낌상으로는 MemberService 인터페이스를 넣어야될것같은데 MemberServiceImpl이 들어가는 이유가궁금합니다... 너무 당연하긴하지만 MemberService가 들어가도 검증이 되는지 궁금합니다.그리고 하나 더 궁금한건 객체 타입이면 memberService이렇게 들어가면되는데 확장자 이름까지 들어가는지궁금합니다. ex) MemberServiceImpl -> MemberServiceImpl.classpackage hello.core.beanfind; import hello.core.AppConfig; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static org.assertj.core.api.Assertions.*; class ApplicationContextBasicFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("빈 이름으로 조회") void findBeanByName() { MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("이름 없이 타입만으로 조회") void findBeanByType() { MemberService memberService = ac.getBean(MemberService.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("구체 타입으로 조회") void findBeanByName2() { MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("빈 이름으로 조회X") void findBeanByNameX() { //ac.getBean("xxxxx", MemberService.class); Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxxx", MemberService.class)); } }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메소드 작성 기준 질문 (Order 엔티티의 addOrderItem 메서드 관련)
https://www.inflearn.com/questions/1138263 이분 내용에 이어서 질문 드립니다.(양방향 연관관계에서 연관관계 편의 메서드를 어디에 정의할지 관련)JPA 기본편 내용에서 들었던 것에서 혼동이 조금 생겨서요.원래 "연관관계 주인이 있는 쪽에서 편의메서드를 정의할 것을 권장한다" 로 알고 있었으나,위 링크 답변을 보니 "비즈니스 로직을 개발할 때 자주 사용하게 되는 중심" 에 적용해도 되는 걸로 이해했습니다.그럼 어디에 두던 상관은 없지만, 양방향일 경우 두 엔티티 간 참조 무한루프가 걸릴 수 있으니 한 쪽에만 편의메서드를 정의할 것으로 정리하면 될까요? 감사합니다 🙂
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
왜 lombok이 없다고 나올까요...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MemberRepositoryTest 중 테스트 실패 원인이 lombok이 존재하지 않는다고 나옵니다.plugin에 lombok이 깔려있는 것을 확인했고annotation도 설정해줬습니다.Member 클래스에도 lombok이 잘 적용됐고요.MemberRepository는 이렇습니다. 마지막으로 MemberRepositoryTest는 이렇습니다. 제가 어느 부분에서 놓친 것인지 잘 모르겠습니다.lombok 재설치와 intellij 재시작을 몇번을 했는지 모르겠습니다.어느 부분에서 제가 놓쳤는지 알려주실 수 있으신가요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
콘솔 한글 깨짐
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 인프런에 나와있는 글깨짐 커뮤니티 글들과 인터넷을 찾아봐도 해결이 안되네요...ㅠㅠ 위 과정을 모두 해보았는데.....ㅜㅜ또 다른 방법이 없을까요.....
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
8강 재질문입니다 (코드포함) (해결)
코드를 다시 찬찬히 살펴봐도 틀린게 뭔지 모르겠어요...시간나시면 검토 가능 하실까요? 아니면 처음부터 다시 코딩을 해봐야겠네요////package com.group.libraryapp.UserController; import com.group.libraryapp.domain.user.User; import com.group.libraryapp.dto.calculator.request.user.response.UserResponse; import com.group.libraryapp.user.request.UserCreateRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.*; @RestController public class UserController { private final List<User> users = new ArrayList<>(); @PostMapping("/user") // POST /user public void saveUser(@RequestBody UserCreateRequest request){ users.add(new User(request.getName(), request.getAge())); } @GetMapping("/user") public List<UserResponse> getUsers(){ List<UserResponse> responses = new ArrayList<>(); for(int i=0; i<users.size(); i++){ responses.add(new UserResponse(i + 1, users.get(i))); }//users에 저장한 유져들을 for문으로 userResponse형태로 바꾸어 결과 list에 추가 return responses; } } package com.group.libraryapp.dto.calculator.request.user.response; import com.group.libraryapp.domain.user.User; public class UserResponse { private long id; private String name; private Integer age; public UserResponse(long id, User user) { this.id = id; this.name = user.getName(); this.age = user.getAge(); } public long getId() { return id; } public String getName() { return name; } public Integer getAge() { return age; } } package com.group.libraryapp.domain.user; public class User { private String name; private Integer age; public String getName() { return name; } public Integer getAge() { return age; } public User(String name, Integer age) { if(name == null || name.isBlank()){ throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.", name)); } this.name = name; this.age = age; } } // 해결했습니다.강사님께서 화면공유 방법으로 해결해주셨고 말씀해주신 해결방법은인텔리제이에서 run 후 오류내역에서 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.group.libraryapp.user.request.UserCreateRequest` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]확인하셨고UserCreateRequest클래스에서 기본생성자를 추가하여 해결하였습니다.매개변수가있는 생성자를 사용하면 추가로 기본생성자를 만드는 습관을 들이겠습니당
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
무엇을 jar 해야하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]필자는 2분 57초까지 했을 때, 여기서 사진 마지막 부분에 ls로 무엇이 있는지 확인을 했는데 jar 파일이 두개가 떠서 저 경우에는 무엇을 jar 해야하는지 여쭙고 싶어요+ 강의에서 보면 ll 명령어를 사용하는데 저 명령어가 저는 없는 명령어라고 뜨는 것 같아서요, 뭐라쳐야하나요? 저 또한 MAC OS 입니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
혹시 git 플러그인 아시는 분
수업에서 git 커밋메세지 사용할 때 옆에 나오는 것들 어떻게 나오는지 아시는 분 계시나요?intellij 기능인지 플러그인인지 인 것 같은데요.아시는 분 있으시면 답변 주시면 감사하겠습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실무에서 주로 사용하는 DB툴이 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 주로 H2 데이터베이스를 활용해 강의를 진행해주시는데, 실무에서는 데이터베이스를 다룰 때 보통 어떤 툴을 사용하는 지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Cannot resolve regions
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.[add-form.html]그대로 따라했는데 th:field=*{regions}에 에러가 생겼습니다. 원인이랑 해결 방법이 무엇일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jdk , 인텔리제이의 버전을 맞췄는데도 오류가 뜹니다
https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71216&tab=community&category=questionDetail&q=1133756 ㄴ 위의 질문 올린 분과 같은 오류가 떠서 Gradle Projects를 Gradle로 바꿨더니 아래와 같은 오류가 뜨네요 ,, 구글링 했더니 Build and Run을 인텔리제이로 바꾸라는 내용이 나오는데, 그렇게 하면 강의를 따라갈 수가 없어서요 ㅠㅠ 자바 버전을 맞추라는 내용도 있었지만 이미 다 맞춘 상태입니다 ,, 어디가 문제일까요 ?? 아래는 저의 환경설정 입니다
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의 내용은 아니지만 진도와 체득에서 질문이 있습니다..
영한 선생님 강의를.. Http부터 시작해서 지금 실전 2편까지 쭉 로드맵대로 왔는데요.. 실전 2편부터는 지금까지 MVC와는 다르게 API개념이 익숙지 않다보니 머리가 많이 뒤죽박죽이고 과열(?) 된 상태입니다..영한쌤이야 워낙 쉽게 설명해주시고 이해도 잘 되서 강의 들을 땐 좋지만 막상 누가 강의 후에 강의 내용을 기반으로 하되 강의 소스코드 보지말고 복붙하지 말고 새로운 코드를 짜봐! 하면 사실 자신 없다라는게 제 솔직한 심정인데.. 여기서 어떻게 방향을 잡아야 할지 모르겠네요.. 시간이 걸리더라도 완강한 강의 중 부족한 부분을 다시 듣고 토이프로젝트 반복 후에 실전 2편과 나머지 querydsl이나 data jpa를 들어가는게 나을지 아니면 일단 쭉 로드맵 끝낸 후에 복습으로 들어가는게 나을지 고민이 됩니다.물론 시간 충분한 학부생이면 모르겠지만 취준생 입장이라 고민이 더더욱 크네요..
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션7의 PRG Post/Redirect/Get 질문입니다.
섹션 7의 PRG Post/Redirect/Get에서요, 7:30에retrun "basic/item";이 부분을 리다이렉트로 수정하시는데요, 혹시 basic/item 뷰페이지로 이동되지 않고 그대로 남는 이유가,포스트요청이라서 리턴값을 뷰페이지로 취급하지 않는 것 아닌가해서요.겟요청이였으면 저렇게 리턴을 했어도 뷰페이지로 자동 리다이렉트까지 되었지 않았을까요...? 그대로 남는 이유를 새로고침으로 인한 중복 오류를 중심으로 말씀해주시지만 리턴값과 연결해서 설명해주시지 않으셔서 헷갈리네요.
-
미해결스프링 핵심 원리 - 기본편
IOC 제어의 역전 프레임워크
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의 4:50쯤에 프레임워크 설명하실 때MemberApp에서 main 메소드를 실행하는 것은 개발자가 직접 제어하는 것이라고 하셨는데 이해가 잘 안가서요 ㅠㅠ 그럼 이 경우는 프레임워크가 내가 작성한 코드를 제어하는 것이 아니므로 프레임워크가 아닌가요? 프레임워크와 라이브러리 차이에 대해 좀 더 자세한 설명 부탁드립니다!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
synchronized 활용 시 StockServiceTest의 일부 테스트가실패하는 이유
synchronized를 이용해서 동시성 이슈를 해결한 후StockServiceTest를 실행 했을 때 왜 둘 중 하나의 테스트가 실패하는지 궁금합니다.테스트 메소드 각각 따로 실행하면 각자 성공하는데, 함께 실행하면 둘 중 하나의 테스트가 실패합니다.실패 시 다음과 같은 에러가 발생합니다.java.lang.NullPointerException: Cannot invoke "com.example.stock.domain.Stock.decrease(java.lang.Long)" because "stock" is null@BeforeEach, @AfterEach로 테스트 실행 전 Stock을 저장/삭제를 하고 있기 때문에 함께 실행해도 문제 없을 것으로 생각되어 질문 남깁니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Mono 의 정의를 잘 모르겠습니다..
안녕하세요 문의 사항이 있어 글을 올립니다.@PutMapping("/{userId}") public Mono<User> updateUser(@PathVariable Long userId, @RequestBody UserUpdateRequestDto userRequestDto) { return mainService.updateUser(userId, userRequestDto); }public Mono<User> updateUser(Long id, UserUpdateRequestDto userUpdateRequestDto) { // 데이터베이스에서 사용자 조회 return dataRepository.findById(id) .flatMap(existingUser -> { // 기존 사용자가 있으면 업데이트 수행 existingUser.setName(userUpdateRequestDto.getName()); // 다시 데이터베이스에 저장 return dataRepository.save(existingUser); }); } 과 같이 Mono<User> 를 리턴 하는데 포스트맨으로 응답이 json 형태로 옵니다.저는 User를 리턴한게 아닌 Mono<User> 를 리턴한건데 어떻게 포스트맨이 별도의 처리 없이 Mono 안의 User 값을 받을 수 있나요?Mono<User> userMono = webClient.get() .uri("/user/{id}", userId) .retrieve() .bodyToMono(User.class);위와 같은 코드를 보았는데 이 경우 Mono<User> userMono로 받게 되던데 결국 리턴은 Mono<User> 가 맞는거 같은데포스트맨이 어떻게 User 값을 바로 가져다 썼는지 이해가 잘 안가서 질문 올립니다.+ 추가로 mono나 flux는 subscribe()를 해줘야 동작을 한다고 하셨었는데 subscribe()를 적지 않았는데 어떻게 update가 동작한건지 궁금합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 롤백,,?
안녕하세요 강사님. 프로젝트 진행중에 간단한 테스트 작업 중 이상한 결과가 나와서 질문드립니다..!@Transactional @SpringBootTest @ActiveProfiles("test") class ProductListResponseDtoTest { @Autowired ProductRepository productRepository; @Test @DisplayName("주문 상세가 주어졌을 때 ProductListResponseDto 변환") public void ofWithOrderDetail() { Product product = Product.builder() .price(1000L) .name("빵빵이") .productNo("123") .build(); productRepository.save(product); OrderDetail orderDetail = OrderDetail.builder() .product(product) .price(product.getPrice()) .quantity(2L) .build(); // when ProductListResponseDto result = ProductListResponseDto.of(orderDetail); // then assertThat(result).extracting("productId", "productNo", "name", "price", "quantity") .contains(1L, "123", "빵빵이", 1000L, 2L); } @Test @DisplayName("상품과 수량이 주어졌을 때 ProductListResponseDto 변환") public void ofWithProductAndQuantity() { Long quantity = 2L; Product product = Product.builder() .price(1000L) .name("빵빵이") .productNo("123") .build(); productRepository.save(product); // when ProductListResponseDto result = ProductListResponseDto.of(product, quantity); // then assertThat(result).extracting("productId", "productNo", "name", "price", "quantity") .contains(1L, "123", "빵빵이", 1000L, 2L); } }@Transactional를 통해 각 테스트가 롤백되어 productId가 모두 1L 될 것으로 예상하였습니다.그런데 기대와 달리 실패를 하였는데요. 첫번째 테스트(ofWithOrderDetail)의 productId의 값이 2L 되었습니다. insert문과 에러 메세지입니다.Hibernate: insert into product (category_id, created_at, deleted_at, discount_rate, is_own, is_subs, name, price, product_no, stock, thumb_img, updated_at, product_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, default) 2024-01-29T22:28:07.219+09:00 INFO 3636 --- [ main] p6spy : #1706534887219 | took 4ms | statement | connection 3| url jdbc:h2:mem:~/Marketbridge insert into product (category_id,created_at,deleted_at,discount_rate,is_own,is_subs,name,price,product_no,stock,thumb_img,updated_at,product_id) values (?,?,?,?,?,?,?,?,?,?,?,?,default) insert into product (category_id,created_at,deleted_at,discount_rate,is_own,is_subs,name,price,product_no,stock,thumb_img,updated_at,product_id) values (NULL,NULL,NULL,NULL,NULL,NULL,'빵빵이',1000,'123',NULL,NULL,NULL,default); 2024-01-29T22:28:07.299+09:00 INFO 3636 --- [ main] p6spy : #1706534887299 | took 0ms | rollback | connection 3| url jdbc:h2:mem:~/Marketbridge ; Hibernate: insert into product (category_id, created_at, deleted_at, discount_rate, is_own, is_subs, name, price, product_no, stock, thumb_img, updated_at, product_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, default) 2024-01-29T22:28:07.309+09:00 INFO 3636 --- [ main] p6spy : #1706534887309 | took 0ms | statement | connection 4| url jdbc:h2:mem:~/Marketbridge insert into product (category_id,created_at,deleted_at,discount_rate,is_own,is_subs,name,price,product_no,stock,thumb_img,updated_at,product_id) values (?,?,?,?,?,?,?,?,?,?,?,?,default) insert into product (category_id,created_at,deleted_at,discount_rate,is_own,is_subs,name,price,product_no,stock,thumb_img,updated_at,product_id) values (NULL,NULL,NULL,NULL,NULL,NULL,'빵빵이',1000,'123',NULL,NULL,NULL,default); 2024-01-29T22:28:07.317+09:00 INFO 3636 --- [ main] p6spy : #1706534887317 | took 0ms | rollback | connection 4| url jdbc:h2:mem:~/Marketbridge ; java.lang.AssertionError: [Extracted: productId, productNo, name, price, quantity] Expecting ArrayList: [2L, "123", "빵빵이", 1000L, 2L] to contain: [1L, "123", "빵빵이", 1000L, 2L] but could not find the following element(s): [1L] at com.objects.marketbridge.order.service.dto.ProductListResponseDtoTest.ofWithOrderDetail(ProductListResponseDtoTest.java:44) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) of 메서드 입니다.@Getter public class ProductListResponseDto { private Long productId; private String productNo; private String name; private Long price; private Long quantity; @Builder private ProductListResponseDto(Long productId, String productNo, String name, Long price,Long quantity) { this.productId = productId; this.productNo = productNo; this.name = name; this.price = price; this.quantity = quantity; } public static ProductListResponseDto of(Product product, Long quantity) { return ProductListResponseDto.builder() .productId(product.getId()) .productNo(product.getProductNo()) .name(product.getName()) .price(product.getPrice()) .quantity(quantity) .build(); } public static ProductListResponseDto of(OrderDetail orderDetail) { return ProductListResponseDto.builder() .productId(orderDetail.getProduct().getId()) .productNo(orderDetail.getProduct().getProductNo()) .name(orderDetail.getProduct().getName()) .price(orderDetail.getProduct().getPrice()) .quantity(orderDetail.getQuantity()) .build(); } } 현재 Product 엔티티의 Id는 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 이루어져 있습니다.추가적으로 @ActiveProfiles("test")에 해당하는 yml의 일부는 아래와 같습니다.datasource: url: jdbc:h2:mem:~/Marketbridge driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: none show-sql: true properties: hibernate: format_sql: true default_batch_fetch_size: 100 defer-datasource-initialization: true h2: console: enabled: true 이런 경우는 처음이라 어디가 잘못됐는지 찾지 못하겠네요 ㅠㅠ