묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
PK가 여러개로 구성되었을 경우 자동 키 생성전략
안녕하세요.테이블의 칼럼이 A, B, C 이렇게 있을 때A, B에 따라 C가 자동으로 증가되어야 하는 경우 어떻게 해야 할까요?새로 insert되는 객체의 A와 B가 동일한 경우 C의 최대값을 가져와서 +1을 해야 하고다를 경우 C가 1부터 시작해야 합니다.이런 경우 JPA를 통해 해결할 수 있을까요?현재는 수동으로 계산을 하는 로직을 매번 넣고 있습니다.감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test폴더를 삭제해버렸습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 9:12 쯤 부분을 실습하다가JUnit4와 5를 설치와 삭제를 반복하다가실수로 test 디렉토리를 지워버렸습니다.그러니까 그 다음 단계에서 어노테이션이 다 빨간색으로 인식이 안되는데test 디렉토리 지웠을 때 어떻게 복구하면 되는지 궁금합니다.답변 부탁드립니다.
-
미해결스프링 데이터 JPA
spring boot 2.7.13-SNAPSHOT trace 소문자 로그 안나옴
spring boot 2.7.13-SNAPSHOT 버전에서는 소문자 trace로 하면 적용이 안되네요~logging.level.org.hibernate.type.descriptor.sql=trace=>logging.level.org.hibernate.type.descriptor.sql=TRACE
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate 6 부터는 항상 distinct 가 적용된다고 합니다. 따라했는데 결과가 다르게 나와서 한참 해맸네요
원문입니다.DISTINCTStarting with Hibernate ORM 6 it is no longer necessary to use distinct in JPQL and HQL to filter out the same parent entity references when join fetching a child collection. The returning duplicates of entities are now always filtered by Hibernate.Which means that for instance it is no longer necessary to set QueryHints#HINT_PASS_DISTINCT_THROUGH to false in order to skip the entity duplicates without producing a distinct in the SQL query.From Hibernate ORM 6, distinct is always passed to the SQL query and the flag QueryHints#HINT_PASS_DISTINCT_THROUGHhas been removed.
-
미해결실전! Querydsl
p6spy 쿼리 파라미터 노출 안됨
안녕하세요!이번에 spring boot 3.1.0 version 으로 p6spy 라이브러리 설정 후 테스트 코드 실행을 하는데 쿼리 파라미터 값이 확인되지 않습니다.Hibernate: insert into hello values ( ) 2023-06-20T14:55:04.965+09:00 INFO 28956 --- [ main] p6spy : #1687240504965 | took 5ms | statement | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 insert into hello values ( ) insert into hello values ( ); Hibernate: select h1_0.id from hello h1_0 2023-06-20T14:55:05.596+09:00 INFO 28956 --- [ main] p6spy : #1687240505596 | took 7ms | statement | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 select h1_0.id from hello h1_0 select h1_0.id from hello h1_0; 2023-06-20T14:55:05.717+09:00 INFO 28956 --- [ main] p6spy : #1687240505717 | took 9ms | rollback | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 ; 2023-06-20T14:55:05.759+09:00 INFO 28956 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-06-20T14:55:05.763+09:00 INFO 28956 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-06-20T14:55:05.849+09:00 INFO 28956 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0 위 로그 화면에서 보는 것처럼 rollback 이 되기전 insert 문이 실행될 때 값이 비어 있는 상태로 전달되고 있습니다이유를 모르겠습니다 ㅠㅠ
-
미해결실전! Querydsl
JPQL 실행직전 flush외에 clear도 함께 해주는것인지
자바 ORM 표준 JPA프로그램 듣고 넘어왔습니다.이전 기본강의에서는 JPQL이 flush를 먼저 수행이 된후 JPQL쿼리가 동작한다고 배웠는데요.이게 EntityManager의 일반적인 find() 메소드의 경우clear()을 한 뒤 준영속상태에서 비로서 select쿼리가 나가는것으로 알고있습니다. (그렇지 않으면 1차 캐시에서 조회)근데 JPQL의 경우 flush는 자동으로 호출 되지만 clear 즉, 1차캐시와 연관성이 있느냐 없느냐에 대해서 궁금증이 생겼습니다.clear를 직접 해주지 않았음에도 불구하고 쿼리가 나가는 이유에 대해서 clear를 자동으로 해줘서 쿼리가 나가게 된것인지? 혹은 1차 캐시와 상관없이 자연쿼리가 나가게 되는것인지 한번 더 다잡고 가고싶습니다.답변 감사히 기다리겠습니다.
-
해결됨실전! Querydsl
sequence id값이 공유(?)되는 현상에 대한 질문
@GeneratedValue에 의해 Sequence가 호출되어서 순차값이 id에 부여되어 저장되는것으로 알고있습니다.근데, team의 id와 member의 id의 sequence가 마치 공유가 되는듯이 team의 id가 1, 2 그리고 member의 id가 3, 4, 5, 6 으로 저장이 되는 부분에 대해서@Column으로 각각의 id 이름을 다르게 부여했다고 하더라도 @GeneratedValue 어노테이션은 엔티티에 정의한 필드명에 맞춰서 생성이 되어서 그런것인지 궁금합니다.또한, 만약 위 원리가 맞다면 실무에서는 이런 부분에 대해서 각각을 명확하게 구분지어서 해야할거같다 라는 생각이 들었으며,그렇다면 실무에서는 애초에 @Column에 의한 DB 컬럼명 변경이 아닌 엔티티 자체의 필드명에서 부터 다르게 지정해 줘야 하는것이 아닐까 하는 생각을 해봤습니다.이 부분에 대해 바람직하게 생각한것이 맞을까요?
-
해결됨실전! 스프링 데이터 JPA
Spring Data JPA 페이징과 default_batch_fetch_size
JPA에서 컬렉션 조회와 페이징을 함께 사용하려면ToOne (OneToMany, OneToOne) 관계를 모두 페치 조인하고, 지연 로딩 성능 최적화를 위해 hibernate.default_batch_fetch_size 옵션을 적용해야 한다.라고 배웠었는데 이 내용이 Spring Data JPA에서도 컬렉션을 조회하면서 페이징 관련된 Pageable, Page 등을 사용하기 위해서는default_batch_fetch_size 를 적용해줘야 하는 거죠??
-
미해결실전! Querydsl
PostgreSQL JDBC and json 타입 column 데이터 save
DB mysql 에서는 잘 동작하던 것이 DB 변경할 일이 생겨, mysql -> postgresql 로 전환하였습니다.데이터 insert 시 json 타입 때문에 발생한 에러인데.. 어떻게 조치하면 좋을지 모르겠습니다.SchedulingTask 엔티티@Entity @Getter @Setter @NoArgsConstructor @Slf4j public class SchedulingTask { @Id @Column(name = "task_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "jsonb") private String requestBodyString; }저장 하는 코드 public SchedulingTask save(Dbaas dbaas, int priority, ReqInfo reqInfo, String requestBodyString) { log.info("requestBodyString : {}", requestBodyString); SchedulingTask schedulingTask = reqInfo2SchedulingTaskMapper.to(reqInfo, requestBodyString, priority, dbaas); log.info("schedulingTask : {}", schedulingTask.getRequestBodyString()); return schedulingTaskRepository.save(schedulingTask); } log2023-06-20T10:19:10.064+09:00 INFO 15806 --- [nio-8087-exec-1] c.k.c.a.s.t.SchedulingTaskTxService : requestBodyString : {"parameter_group_id":"86dc6f7f-75c5-48a2-b0c6-5e07d5c54f5a","request_type":"scheduled instant","reservation_date_time":"2023-09-30 15:02:00"} 2023-06-20T10:19:10.068+09:00 INFO 15806 --- [nio-8087-exec-1] c.k.c.a.s.t.SchedulingTaskTxService : schedulingTask : {"parameter_group_id":"86dc6f7f-75c5-48a2-b0c6-5e07d5c54f5a","request_type":"scheduled instant","reservation_date_time":"2023-09-30 15:02:00"} 2023-06-20T10:19:10.111+09:00 WARN 15806 --- [nio-8087-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42804 2023-06-20T10:19:10.111+09:00 ERROR 15806 --- [nio-8087-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: column "request_body_string" is of type jsonb but expression is of type character varying Hint: You will need to rewrite or cast the expression. Position: 359 repository 에 직접 저장 시, requestBodyString 을 json 으로 직접 바꿔줘야 하나요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
spring 2.x - Querydsl 이슈있는분들 참고하세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"}group = 'com.example'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'ext["hibernate.version"] = "5.6.5.Final"configurations { compileOnly { extendsFrom annotationProcessor}}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'javax.validation:validation-api' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5' //JdbcTemplate 추가 //implementation 'org.springframework.boot:spring-boot-starter-jdbc' //MyBatis 추가 implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' //JPA, 스프링 데이터 JPA 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" //H2 데이터베이스 추가 runtimeOnly 'com.h2database:h2' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok'}tasks.named('test') { useJUnitPlatform()}//querydsl 추가//def querydslDir = '$buildDir/generated'def querydslDir = "src/main/generated"//clean {// delete file(generated)//}querydsl { library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir}sourceSets { main { java { srcDirs = ['src/main/java', querydslDir]} }}compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl}configurations { querydsl.extendsFrom compileClasspath} 강사님이 올려주신 내용 + 구글링 + 직접 수정했습니다. 간혹, 빌드는 되는데 generated 파일에 QClass 안보이시는 분들은 queryDsl 저장되는 경로에 $buildDir 대신 'src/main/'으로 해보세요
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
H2 가 아닌 mysql DB 를 사용중인데 조그만한 질문이 있습니다.
재기동을 했음에도 불구하고 쿠키값이 그대로 남아있는 현상이 있어서 원하는 요청이 정상적으로 이루어지지 않았던 문제가 있었습니다.이상해서 원인을 파악하다보니 현재 전 mysql DB 를 연결하여 사용중이었고, 호돌맨님은 H2 DB 를 사용중이시더라구요.그래서 재기동을 할때마다 쿠키값이 삭제되고 다시 생성이 되지 않았던 건데 혹시 이런 상황에서 조언이 될 만한 링크나 키워드를 알려주실 수 있으실까요??제가 직접 삽질하면서 찾아보고 해결해보려구요 ㅠㅠ(현재는 매번 재기동 할때마다 쿠키값을 직접 삭제해주면서 강의를 따라가고 있습니다)
-
해결됨실전! 스프링 데이터 JPA
단건 조회 처리 방식에 대해
단건 조회는 결과가 없을 경우 예외 발생 대신 null을 반환한다고 하였는데이 null을 어떤 방식으로 처리하는게 좋은 방법인가 싶어 질문 드립니다.질문 드리고 싶은 방법은 아래와 같이 2가지입니다.둘 중 어느 방식을 사용하는게 더 좋을까요? if문을 통해 null일 시에 런타임 예외 터트리기Member member = memberRepository.findById(10L) if (member == null) { throw new CustomException("찾고자 하는 멤버가 없습니다."); } 반환 타입을 Optional로 감싸 반환하기.Optional<Member> member = memberRepository.findById(10L).orElseThrow(() -> new CustomException("찾고자 하는 멤버가 없습니다."));
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team이 존재하지않는 member가 존재할때 nullpointerExc
Team team = new Team(); team.setName("TeamA"); em.persist(team); Team team2 = new Team(); team2.setName("TeamB"); em.persist(team2); Member member1 = new Member(); member1.setUsername("회원1"); member1.setTeam(team); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setTeam(team); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setTeam(team2); em.persist(member3); Member member4 = new Member(); member4.setUsername("회원4"); member3.setTeam(null); em.persist(member4); em.flush(); em.clear(); List<Member> lazyLoadingResult = em.createQuery("select m from Member m ", Member.class).getResultList(); for (Member member : lazyLoadingResult) { System.out.println("member = " + member.getUsername() + ", " + ((member.getTeam().getName() == null) ? "null" : member.getTeam().getName())); }위와 같이 team이 존재하지 않는 Member 데이터를 추가한 뒤에 inner join을 하게될 경우nullpointerException이 발생합니다.객체 탐색을 활용하면 발생하게 되는 문제로 이해는 했지만 JPQL을 사용하였을 때 이에 대한 해결책으로는 어떤 게 있을까요?3항연산자로 사용 처리를 해보려고 하였으나 객체 탐색이기 때문에 처리가 되지 않고 있습니다.case문을 활용할 수 밖에 없을까요?
-
미해결
Datasource와 JPA를 같이 사용 할 경우 트랜잭션매니저
안녕하세요 스프링 데이터 접근 기본 1편 에 강의 내용 중 JpaTransactionManager와 DatasourceTransactionManager를 같이 사용할 경우 JpaTransactionManager 를 사용하면 된다고 하셨는데 관련해서 궁금한 것이있습니다. Jpa와 myBatis를 같이 사용 할 경우 반드시 JpaTransactionManager를 사용해야 하는지 궁금합니다. 현재 JBPM 이라는 오픈소스를 근간으로 하는 솔루션을 개발 중인데 해당 오픈소스 엔진영역은 JPA를 사용하고 나머지 Service class에는 myBatis를 사용 중입니다. 현재 직면하고있는 문제는 일반 서비스 클래스에서 DatasourceTransactionManager로 트랜잭션이 이어지는 중에 JpaTransactionManager를 사용하고 있는 클래스를 호출 하게 되면 JpaTransactionManager 의 getTransaction() 메서드에서 unable to begin transaction 이라는 에러가 발생합니다. 현재 AOP 로 일괄적으로 2개의 트랜잭션매니저를 사용 하고 있는데, AOP DatasourceTransactionManager 를 주석 처리 하니까 에러가 발생하지 않습니다. 2개의 트랜잭션매니저를 사용해서 발생하는 문제 일까요? 그렇다면 JpaTransactionManager 하나만 사용하면 될까요 ?영한님 께서 트랜잭션이 시작되면 TransactionManager에서 커넥션을 생성하고 쓰레드로컬에 해당 커넥션을 저장한다고 하셨는데, 2개의 트랜잭션 매니저를 사용해서, A 라는 트랜잭션매니저를 사용하고있는 메서드에서 B라는 트랜잭션매니저를 사용하는 메서드를 호출하면, 2개의 커넥션이 생성되는 것인가요 ?
-
해결됨Practical Testing: 실용적인 테스트 가이드
통합, 인수 테스트 사전 데이터 세팅 질문
안녕하세요 강의 잘 보고 있습니다.테스트에 대해 파편화 된 지식을 학습자들이 원하는 내용으로 잘 만들어 낸 좋은 강의라고 생각합니다. 현재 저희 팀음 통합 테스트 및 인수 테스트를 할 때 미리 쿼리문을 작성해두고 이를 @SqlGroup과 @Sql을 활용하여 데이터를 삽입해주고 있습니다.이 경우 강의 내에서 말씀하신 것 처럼 스키마 변경이 생길때마다 모든 쿼리를 찾아 수정해야하는 번거로움이 있습니다. 하지만 매 케이스마다 세팅을 하기에는 연관된 5개~10개의 테이블에 대한 데이터 수십개를 매번 세팅해줘야 하는 것이 어렵게 느껴집니다.이때 repository를 계층을 넘어서까지 임포트 해서 사전 데이터 삽입을 해줘야 하는가 궁금하구요.또한 모든 객체에 Builder를 개방하면 그나마 할만하겠지만 아닌 경우 객체가 제공하는 제한적으로만 생성이 가능할텐데, 리플렉션이라도 써야하는건지 너무 걸리는 경우가 많습니다. 다소 두서 없고 여러 질문을 한번에 했지만 제가 어떤 어려움을 겪는지는 전달 되었으리라 생각합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 강사님 인텔리제이 run을 하면 뜨는 오류때문에 문의드립니다.
이렇게 경고창이 뜨는데요 제가 며칠 쉬다가 강의를 들어서 어디 부분에서 오류가 잡히는지 전혀 감이안와서요 ㅠㅠ딱히 경고창 뜨는 부분도 없고.. 부탁드리겠습니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
교재 구매 문의
안녕하세요. jpa 강의 듣고있는데요 jpa교재도 있더라구요. 근데 그 책이 좀 오래된것 같은데 지금 구매해도 상관없을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프로젝션 임베디드 타입(Address) 쿼리호출 안되는 문제
아래와 같이 쿼리를 구성했는데select쿼리가 나가지 않습니다.어디가 잘못되었는지 궁금합니다..//임베디드 타입 프로젝션(Address) Address address = new Address(); address.setCity("경기도 땡땡"); address.setStreet("땡땡동"); address.setZipcode("00000"); Product product = new Product(); product.setName("제발되라"); em.persist(product); Order order = new Order(); order.setOrderAmount(0); order.setAddress(address); order.setProduct(product); em.persist(order); em.flush(); em.clear(); em.createQuery("select o.address from Order o", Address.class) .getResultList(); 아래와 같이 mapped가 안됬다고 오류가 뜹니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA 특징 중 자동 업데이트 관련
주문 서비스 개발 부분 강의를 듣다가 궁금한 점이 있어 질문드립니다. 주문 취소(OrderService.cancelOrder) 부분에서order.cancel() 만 작성하면 JPA 특징으로 인해, 데이터 업데이트 관련 쿼리 로직 없이 자동으로 업데이트 된다고 하셨는데요. 주문 생성(OrderService.order)의 EntityManager 가 사용된 orderRepository.save(order); 와 혼동이 와서 질문 남깁니다. 주문 취소 order.cancel() 메서드를 타면서 엔티티의 값(status, count 등) 변경 내역이 자동으로 업데이트 되는 것이라고 하면, 주문 생성도 Order.createOrder(member, delivery, orderItem); 를 타면서 엔티티의 값들을 설정하기 때문에 orderRepository.save(order); 를 사용하지 않아도 되는게 아닌가 라는 생각이 듭니다. 제가 JPA 를 잘 몰라서 혼란이 오는 것 같은데.. 쿼리는 직접 작성하지 않아도 업데이트/저장/삭제 등 DB 조작이 일어나려면 EntityManager 를 통해야 된다고 생각하고 있었습니다. 주문 취소는 EntityManager 없이 업데이트 되고, 주문 생성은 EntityManager의 persist() 를 사용해서 저장하는 것 이 2가지 차이점에 대해서 설명 부탁드립니다! 감사합니다 :)
-
미해결실전! 스프링 데이터 JPA
NoSuchElementException: No value present 오류가 납니다ㅠㅠ
@RequiredArgsConstructor @RestControllerpublic class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } public void init() { memberRepository.save(new Member("userA")); } 2023-06-17T14:29:55.066+09:00 DEBUG 6856 --- [nio-8080-exec-1] org.hibernate.SQL :selectm1_0.member_id,m1_0.age,m1_0.created_by,m1_0.created_date,m1_0.last_modified_by,m1_0.last_modified_date,m1_0.team_id,m1_0.usernamefrommember m1_0wherem1_0.member_id=?2023-06-17T14:29:55.068+09:00 INFO 6856 --- [nio-8080-exec-1] p6spy : #1686979795068 | took 0ms | statement | connection 4| url jdbc:h2:tcp://localhost/~/datajpaselect m1_0.member_id,m1_0.age,m1_0.created_by,m1_0.created_date,m1_0.last_modified_by,m1_0.last_modified_date,m1_0.team_id,m1_0.username from member m1_0 where m1_0.member_id=?select m1_0.member_id,m1_0.age,m1_0.created_by,m1_0.created_date,m1_0.last_modified_by,m1_0.last_modified_date,m1_0.team_id,m1_0.username from member m1_0 where m1_0.member_id=1;2023-06-17T14:29:55.071+09:00 INFO 6856 --- [nio-8080-exec-1] p6spy : #1686979795071 | took 0ms | commit | connection 4| url jdbc:h2:tcp://localhost/~/datajpa;2023-06-17T14:29:55.074+09:00 ERROR 6856 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.util.NoSuchElementException: No value present] with root causejava.util.NoSuchElementException: No value presentat java.base/java.util.Optional.get(Optional.java:143) ~[na:na]at study.datajpa.constoller.MemberController.findMember(MemberController.java:18) ~[classes/:na]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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.9.jar:6.0.9]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.9.jar:6.0.9]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.9.jar:6.0.9]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.9.jar:6.0.9] http://localhost:8080/members/1에 userA가 나와야 하는데 Whitelabel Error Page가 뜨고 위와 같은 오류가 나옵니다.