묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의영상 5분 7초 EAGER 패치 전략
비슷한 게시글을 봐도 이해가 잘 가지 않아서 재차 질문 드립니다제가 이해하는 상황이 맞는지 고견 부탁드립니다1. fetch = EAGER 쿼리가 두 번 실행이것이 프록시 강의영상에서 말씀하시는 (N+1) 문제인지 궁금합니다첫 번째 쿼리는em.flush(), em.clear() 실행되면 영속성 컨텍스트가 비워지고 이후 jpql 쿼리가 실행되면서 EAGER 패치 전략에 따라 Team도 함께 조회가 됩니다. 두 번째 쿼리는 영속성 컨텍스트가 비워졌고 EAGER 패치 전략으로 조회되어야 합니다. 실제 엔티티로 조회되어야 하는걸로 알고있습니다하지만 특정 시점에서 Team이 프록시로 로드 되었고 이후 프록시가 초기화되면서 다시 데이터베이스에서 조회하면서 발생한 쿼리로 생각이 듭니다
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
한번만 도와주세요 오류를 못찾겠습니다.
사이드 바에 skill이랑 project만 페이지 오류가발생합니다. skill 들어갔을떄 오류 로그는 project 들어갔을떄 오류 로그 깃허브 주소:https://github.com/kimauto/portfolio-kimauto이렇게 오류가 뜨면 No static resource admin/skill저는 skill 컨트롤러,서비스,DTO 가서 제가 코드 실수를 했나 먼저 확인하고 용백님 깃헙 소스코드랑 비교하면서 오류 체크를 했습니다. 이렇게 오류를 접근하는 방식이 맞나요? 무슨 문제일까요?
-
미해결실전! 스프링 부트와 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 디렉토리 하위 파일들이 보이지 않습니다. 어떻게 해결할 수 있을까요? 커뮤니티의 내용들을 다 참고했지만 되지 않네요..
-
미해결코드로 배우는 React with 스프링부트 API서버
세션 10번 완성 소스가 잘못올라온거 같아요
세션 10번 강의 보면서 따라가고 있는데 org.springframework.dao.DataIntegrityViolationException: could not execute statement [(conn=335) Cannot add or update a child row: a foreign key constraint fails (`apidb`.`tbl_cart_item`, CONSTRAINT FKs7vg62w3nq7igdxgssq1u0biw FOREIGN KEY (`product_pno`) REFERENCES tbl_product (`pno`))] [insert into tbl_cart_item (cart_cno,product_pno,qty) values (?,?,?) returning cino]; SQL [insert into tbl_cart_item (cart_cno,product_pno,qty) values (?,?,?) returning cino]; constraint [null] 에러가 나오더라구요..그래서 제가 세션 10 완성 소스 보면서 잘못된 곳을 찾아 보려는데 ... 올라건 소스가 잘못된거 같아요... 세션 10의 소스가 아닙니다.
-
미해결코드로 배우는 React with 스프링부트 API서버
LocalDateFormatter에 대해서 궁금한 점이 있습니다.
public ResponseEntity searchLinkOrderNumberOutput( @ApiParam("주문 번호") @RequestParam(required = false) List<String> orderNumbers, @ApiParam(name = "startDate", value = "yyyyMMdd", required = true) @RequestParam String startDate, @ApiParam(name = "endDate", value = "yyyyMMdd", required = true) @RequestParam String endDate, @ApiParam(name ="confirmationStatus", value="확정여부(Y/N)") @RequestParam String confirmationStatus, @ApiParam(name = "pageSize", value = "한 페이지에 보여줄 주문 개수 (미 입력시 기본값 20)") @RequestParam(defaultValue = "20") int pageSize, @ApiParam(name = "pageNumber", value = "데이터를 조회 할 페이지 숫자 (미 입력시 기본값 1)") @RequestParam(defaultValue = "1") int pageNumber) {궁금한 점이 있습니다 선생님 만일 controller에서 string으로 날짜값을 받으면 이제 별도의 파싱작업을 거쳐서 LocalDateTime 형식으로 변환해 줘야하는데 LocalDateFormatter을 사용하면 해당 작업을 생략할 수 있는건가요???
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의에서의 회원가입 테스트를 JUnit5 방식으로 바꾸면 이게 맞을까요?
@ExtendWith(SpringExtension.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); Member joinedMember = memberRepository.findOne(savedId); //then assertThat(member).isEqualTo(joinedMember); } 이렇게 진행하면 될까요?
-
미해결코드로 배우는 React with 스프링부트 API서버
ProductSearchImpl 관련 질문드립니다.
@Override public PageResponseDTO<ProductDTO> searchList(PageRequestDTO pageRequestDTO) { log.info("----------------------searchList-------------------------"); Pageable pageable = PageRequest.of( pageRequestDTO.getPage() -1, pageRequestDTO.getSize(), Sort.by("pno").descending()); QProduct product = QProduct.product; QProductImage productImage = QProductImage.productImage; // from 절 JPQLQuery<Product> query = from(product); // join // @ElementCollection을 join 할때는 아래와 같이 사용해야합니다. // product.imageList를 productImage로 사용하겠다. query.leftJoin(product.imageList, productImage); query.where(productImage.ord.eq(0)); Objects.requireNonNull(getQuerydsl()).applyPagination(pageable,query); List<Tuple> productList = query.select(product,productImage).fetch(); // 쿼리를 실행시키기 위함. long count = query.fetchCount(); log.info("======================="); log.info(productList); return null; }이 코드에서 return 값을 넘기고 싶어서 수정하는데 어떻게 해야 값이 넘어가는지를 잘 모르겠습니다...TodoSearchImpl에서는 new PageImpl<>() 사용하셔서 넘기셨는데 여기서는 어떻게 처리해야 될까요??2. ProductServiceImpl의 getList() 메서드와 동일한 역할인거같은데, ProductSearchImpl 에서는 querydsl을 사용하셔서 보여주신거고 ProductServiceImpl에서는 jpa를 사용하는 방법을 보여주신게 맞는지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
GenerationType.IDENTITY 의문점
[질문 내용]Long 으로 잡았을땐 db에 데이터가 들어가지는데 왜 String으로 하면 오히려 테이블이 사라지나요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
api 게이트 웨이 오류
user-service에선 정상적으로 실행되지만 api 게이트웨이 오류가 납니다. 403 오류입니다 인강에서 token secret값이 주석 처리 되어 있는데 실제로 인강에선 어떻게 실행된지 궁금합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]링크 : https://drive.google.com/drive/folders/1VfZnK2GoZrg7pMOsahW0ERZVXFL_w_6X?usp=drive_link강의를 듣다가 의문이 생겨서 질문 드립니다. 코드를 작성하여 table에 값들을 저장하고 이후에 update를 em.find()를 통해 하려하거나 그동안 저장했던 member값들을 em.createQuery하려할 때 모두 테이블 값이 초기화되면서 아무것도 값을 가져오지 못하는 상황이 발생하는데 설정 문제인지 계속 롤백이 되도록 되어있는 것인지 궁금하여 질문드립니다. 링크도 첨부하겠습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
address 질문
[질문 내용]안녕하세요 영한님 질문이 있어서 올리게되었습니다.다름이 아니라 address는 엔티티가 아닌 값타입이라고 하셨는데주소를 수정하는개념이 아닌회원 하나당 주소를 여러개를 가져야 할 경우 주소를 entity로 사용해도 되나요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 편의 메소드 사용 이후
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]연관 관계 편의 메소드 team의 addMember 혹은 member의 changeTeam메소드를 사용한 이후로는 em.flsush와 em.clear 따로 호출하지 않아도 정상작동한다고 이해햇는데 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티를 외부에 노출하면 안 된다는 의미
안녕하세요.엔티티를 파라미터로 받으면 안 되는 이유에 대해서는 말씀해주셔서 이해하였습니다.엔티티에 화면 검증 로직이 들어가는 문제엔티티를 변경하면 API 스펙이 변경되는 문제그리고 엔티티를 외부에 노출하면 안 된다고 말씀하셨습니다.엔티티에서 필요한 변수만 사용하거나, 추가 변수를 사용하고자 해서 DTO로 반환하는 걸로 추측했습니다. 그런데 뭔가 더 구체적이고 다양한 이유가 있을 것 같아 직접 설명을 듣고 싶어 질문 드립니다.감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
db순서가 이상해요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]db순서가 영어 알파벳 순서대로 바뀌네요 왜 그러는건지이해가 안됩니다,
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
gradlew clean build 시 예외가 발생합니다.
> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Spring_kyh/%EC%8A%A4%ED%94%84%EB%A7%81%20%EB%B6%80%ED%8A%B8%EC%99%80%20JPA%20%ED%99%9C%EC%9A%A91/jpashop/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 4s8 actionable tasks: 8 executed 다른 질문들 찾아보다가 https://www.inflearn.com/community/questions/1251256/gradlew-%EB%B9%8C%EB%93%9C%EA%B0%80-%EA%B3%84%EC%86%8D-%EC%8B%A4%ED%8C%A8%EB%A1%9C-%EB%9C%B9%EB%8B%88%EB%8B%A4?focusComment=336001이 답변을 보고 gradle도 8.5로 바꿔봤는데 똑같은 오류가 발생해 질문드립니다. 환경변수도 제대로 설정했는데도 똑같은 증상이 발생합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 콘솔처럼 rolled back 기록이 안 보이네요
@ExtendWith(SpringExtension.class) @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); }2024-08-27T08:46:11.488+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-08-27T08:46:11.607+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/jpashop user=SA 2024-08-27T08:46:11.610+09:00 INFO 20440 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2024-08-27T08:46:12.826+09:00 INFO 20440 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2024-08-27T08:46:12.846+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : drop table if exists member cascade 2024-08-27T08:46:12.853+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : drop sequence if exists member_seq 2024-08-27T08:46:12.860+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : create sequence member_seq start with 1 increment by 50 2024-08-27T08:46:12.866+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : create table member ( id bigint not null, username varchar(255), primary key (id) ) 2024-08-27T08:46:12.872+09:00 INFO 20440 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-08-27T08:46:13.228+09:00 WARN 20440 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2024-08-27T08:46:13.272+09:00 INFO 20440 --- [ Test worker] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] 2024-08-27T08:46:13.987+09:00 INFO 20440 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Started MemberRepositoryTest in 6.47 seconds (process running for 8.794) WARNING: A Java agent has been loaded dynamically (C:\gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.19\154da3a65b4f4a909d3e5bdec55d1b2b4cbb6ce1\byte-buddy-agent-1.14.19.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release 2024-08-27T08:46:14.774+09:00 DEBUG 20440 --- [ Test worker] org.hibernate.SQL : select next value for member_seq Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2024-08-27T08:46:14.914+09:00 INFO 20440 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-08-27T08:46:14.918+09:00 INFO 20440 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-08-27T08:46:14.933+09:00 INFO 20440 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. > Task :test BUILD SUCCESSFUL in 26s 4 actionable tasks: 1 executed, 3 up-to-date 오전 8:46:15: Execution finished ':test --tests "jpabook.jpashop.MemberRepositoryTest.testMember"'. Transactional 애노테이션을 붙였는데 롤백얘기가 안보이네요... JUnit5로 해서 차이가 있는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA강의에서 Build and run using 을 Gradle로 사용하는 이유 알 수 있을까요?
다른 강의에선 작동 속도때문에 전부 인텔리제이로 바꿔서 진행했었는데 강의 교안을 보면 스프링부트 3.2 이상부터는 gradle로 하라고 나와있어 궁금하여 질문드립니다.
-
해결됨실전! 스프링 데이터 JPA
강의 4분 28초에 대해 질문 있습니다.
"성능 최적화를 할텐대 어쨋든 이 데이터를 두 개를 가지고 있어야 돼요" 라는 부분이 있는데요 여기서 하나는 실제 엔티티 객체고 나머지 하나는 스냅샷으로 저장한 초기 상태의 엔티티 객체를 말하는건가요?
-
미해결실전! 스프링 데이터 JPA
단순 조인과 페치 조인에 대해 질문 있습니다.
첫번째 JPQLQuery("select m from Member m join m.team ") List<Member> findInnerJoin(); @Test public void test() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member(10, "member1", teamA); Member member2 = new Member(10, "member2", teamB); memberRepository.save(member1); memberRepository.save(member2); em.flush(); em.clear(); List<Member> members = memberRepository.findInnerJoin(); for (Member member : members) { System.out.println("member = " + member); System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); } }실행결과Hibernate: select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team$HibernateProxy$w0d2fXxq Hibernate: select t1_0.team_id, t1_0.name from team t1_0 where t1_0.team_id=? member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team$HibernateProxy$w0d2fXxq Hibernate: select t1_0.team_id, t1_0.name from team t1_0 where t1_0.team_id=? member.getTeam().getName() = teamB첫번째 JPQL에서는 전형적인 N + 1 문제가 발생함을 알 수 있습니다. 그래서 첫번째 JPQL에서의 select문에 t만 추가를 해봤습니다.두번째 JPQL@Query("select m, t from Member m join m.team t") List<Member> findInnerJoin();실행결과Hibernate: select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username, t1_0.team_id, t1_0.name from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamB위 실행 결과를 보고 페치 조인과 무슨 차이가 있을까 해서 페치 조인을 테스트 해봤습니다.세번째 JPQL@Query("select m from Member m join fetch m.team t") List<Member> findMemberFetchJoinTeam();@Test public void ManyToOneFetchJoin() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member(10, "member1", teamA); Member member2 = new Member(10, "member2", teamB); memberRepository.save(member1); memberRepository.save(member2); em.flush(); em.clear(); List<Member> members = memberRepository.findMemberFetchJoinTeam(); for (Member member : members) { System.out.println("member = " + member); System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); } }실행결과Hibernate: select m1_0.member_id, m1_0.age, t1_0.team_id, t1_0.name, m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id member = Member(id=1, username=member1, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamA member = Member(id=2, username=member2, age=10) member.getTeam().getClass() = class study.data_jpa.entity.Team member.getTeam().getName() = teamB두번째 JPQL과 세번째 JPQL의 차이를 보면 두번째 JPQL의 select문에서 m1_0.team_id 도 조회하고 세번째 JPQL의 select문에서는 m1_0.team_id 을 조회하지 않습니다.두번째 JPQL과 세번째 JPQL이 정확히 어떤 차이가 있어 select문에서 조회하는 컬럼이 달라지는지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
안녕하세요 스프링 시큐리티 테스트에 대한 질문이 있습니다.
스프링 시큐리티를 사용하고 시큐리티 설정안에서 아래와 같은 예외 핸들링을 해주었을때http.exceptionHandling(e -> e.authenticationEntryPoint((request, response, authException) -> {CustomResponseUtil.fail(response, "로그인을 진행해 주세요", HttpStatus.UNAUTHORIZED);}));http.exceptionHandling(e -> e.accessDeniedHandler((request, response, accessDeniedException) -> {CustomResponseUtil.fail(response, "권한이 없습니다", HttpStatus.FORBIDDEN);}));컨트롤러 테스트에서 @WebMvcTest(AccountController.class)class AccountControllerTest {테스트를 하면 예외 핸들링이 안되는거 같은데 맞을까요?이러한 해결방법으로@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)이렇게 사용하면될거같은데 1. @WebMvcTest(AccountController.class) 방식으로도 해결할수 있는 방법이 있을까?2. 어떤 방식을 더 추천하실까요?