묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Movie 엔티티 조회 시 실행되는 SQL Query가 강의 영상과 상이한 이슈에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 고급 매핑 - 상속관계 매핑 강의 영상 16:15 부분에서 Movie 엔티티 조회 코드 실행 결과로 출력되는 SQL Query와 저의 프로젝트의 코드 실행 결과로 출력되는 SQL Query가 상이하여 질문드립니다. 우선 프로젝트 생성은 2024 최신 버전으로 프로젝트 설정하기 문서를 참고해서 진행하였으며, 아래와 같이 작성한 코드 일부와 실행 결과로 출력되는 SQL Query를 첨부드립니다.Movie findMovie = em.find(Movie.class, movie.getId());select m1_0.id, m1_1.name, m1_1.price, m1_0.actor, m1_0.director from Movie m1_0 join Item m1_1 on m1_0.id=m1_1.id where m1_0.id=?위와 같이 강의 영상처럼 SELECT문의 형태가 MOVIE 테이블과 ITEM 테이블의 INNER JOIN이 아닌 INNER JOIN을 직관적(?)으로 나타내고 있지 않는데요. 한가지 예상되는 건 2024년도 기준 프로젝트 생성 시 하이버네이트, H2 DB 버전이 강의 내용에서 다루는 버전들보다 업그레이드 되어 동작 방식이 달라져서 그런게 아닐까 생각이 듭니다. 이 부분이 맞다면 만약, 강의와 동일한 SQL Query를 출력해 보고 싶다면 프로젝트에서 사용중인 라이브러리 버전들을 다운그레이드하는 방법밖에는 없을까요?<!-- TODO s:pom.xml 코드 일부 --> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.2.Final</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.2.224</version> </dependency> </dependencies> <!-- TODO e:pom.xml 코드 일부 -->
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
select문 지연 여부
근데여 JPA가 쓰기 지연 기능을 지원해서 commit 시에 flush되어 db에 반영되고, commit 되는거라고 하셨잖아요?근데 이름이 '쓰기 지연'이고,,, find 한 다음에 바로 다음줄에서 엔티티 조회하면 되는거 보니까 select문(읽기)은 지연되지 않고 바로 날라가는 것 같은데 맞나여?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터베이스 연동 오류
기존 강의 1편에서 들었던 데이터베이스 파일 전부 삭제하고 다시 처음부터 만들어서 해볼려고하는데 이런 에러가 떠서 어떤식으로 해야하나요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence오류.. 도와주세요
왜 참조를 못 하는지 모르겠습니다...
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 단방향 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.왼쪽과 같이 코드를 작성하여 team.getMembers().add(member);을 수행하면 MEMBER 테이블의 TEAM_ID(FK)가 업데이트가 된다고 말씀하셨습니다.아래와 같이 @OneToMany, @JoinColumn 어노테이션을 사용하면 Team 객체에 members의 객체가 추가될 때 마다 JPA가 자동으로 테이블의 FK를 수정하고 업데이트를 해준다는 것으로 이해를 하면 되는건가요? 설명 부탁드립니다 !
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의 자료에서는 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자고 말씀하셨습니다.그래서 저는 "member1의 객체의 필드 중 team을 TeamA로 값을 설정해줘야 하고, TeamA 객체의 필드 중 member에도 member1으로 값을 설정해줘야 한다"라고 이해를 했습니다.하지만, 강의를 진행하시면서 위와 같이 코드를 작성하시면서"둘 중에 한 곳에서만 값을 설정하면 된다"라고 말씀하셨는데 이 부분이 잘 이해가 안됩니다.member 클래스에도 team 필드가 존재하고, team 클래스에도 member 필드가 존재하는데 둘 중 한곳에서만 값을 설정하면 왜 가능한건가요?? 그리고 위에서 작성하신 addMember 메소드 안의 this가 가르키는게 자기 자신의 클래스(team)를 의미하는게 맞나요? 설명 부탁드립니다 !
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
add를 넣지 않았을 때 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.해당 코드에서 list members에 아무런 값이 들어가지 않는 이유가 영속성 컨택스트에만 값이 들어가 있고 DB에는 아직 값이 들어가 있지 않는 상태이기 때문인가요?이 부분이 잘 이해가 안되네요 설명 부탁드립니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
DB에 저장이 안됩니다
java 코드 public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); //code EntityTransaction tx = em.getTransaction(); tx.begin(); Member member = new Member(); member.setId(1L); member.setName("mini"); em.persist(member); // member를 저장 tx.commit(); em.close(); emf.close(); } }로그1월 26, 2024 4:43:27 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [name: hello]1월 26, 2024 4:43:28 오후 org.hibernate.Version logVersionINFO: HHH000412: Hibernate ORM core version 6.4.2.Final1월 26, 2024 4:43:28 오후 org.hibernate.cache.internal.RegionFactoryInitiator initiateServiceINFO: HHH000026: Second-level cache disabled1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using built-in connection pool (not intended for production use)1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: Loaded JDBC driver class: org.h2.Driver1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001012: Connecting with JDBC URL [jdbc:h2::tcp://localhost/~/jpa-exercise]1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {password=****, user=sa}1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH10001115: Connection pool size: 20 (min=1)1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl constructDialectWARN: HHH90000025: H2Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)1월 26, 2024 4:43:28 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateServiceINFO: HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)1월 26, 2024 4:43:28 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7f7b6639] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.1월 26, 2024 4:43:28 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@2abbd0d9] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.Hibernate: drop table if exists Member cascade Hibernate: create table Member ( id bigint not null, name varchar(255), primary key (id) )Hibernate: /* insert for hellojpa.Member */insert into Member (name, id) values (?, ?)1월 26, 2024 4:43:28 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2::tcp://localhost/~/jpa-exercise]Process finished with exit code 0insert 로그도 찍히는데 왜 안들어갈까요...?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 실행오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]다른 질문게시판에도 찾아봤지만 내용이없어서 올립니다. MemberRepositoryTest를 실행하면 Execution failed for task ':test'.Execution failed for task ':test'.> No tests found for given includes: [jpabook.jpashop.MemberRepositoryTest](--tests filter)* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 2s4 actionable tasks: 1 executed, 3 up-to-date 라고 오류가 뜹니다 compiler에서 --warning-mode=all --stacktrace 를 입력하고 file -> Invalidate Caches / Restart를 눌러서 재실행해도 되지않아요ㅜ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블이 생성되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 따라가며 테이블을 생성하려고 했습니다.하지만, 강사님의 화면과는 다르게 create sql문이 출력되지 않으며 , 테이블이 생성되지도 않습니다.1.member entity 코드 작성2.h2 실행3.JpaMian 실행 이 순서대로 진행을 했는데 테이블이 생성되지 않는 원인이 무엇인가요?? 답변 부탁드립니다 !
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@JsonIgnore 관련 ClassNotFoundException 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@JsonIgnore을 어느 클래스에 어디어디 붙여야 할까요?"http://localhost:8080/api/v1/simple-orders"api 테스트를 해보니 아래와 같은 에러가 나서 질문드립니다 2024-01-25T22:37:28.102+09:00 DEBUG 32028 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows only2024-01-25T22:37:28.226+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient] with root causejava.lang.ClassNotFoundException: javax.persistence.Transient at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]2024-01-25T22:37:28.277+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient
-
미해결코드로 배우는 React with 스프링부트 API서버
jwt 토큰 security에 관하여...
jwt를 사용하는 이유가 무상태의 장점 때문인 것으로 알고 있습니다.그리고 Security의 경우 세션을 기본적으로 생성하는데 jwt 토큰을 발급한 이후에는 세션이 생기지 않도록 설정하신 것 같습니다.그렇다면 궁금한 점이 있습니다.세션을 통해서 로그인 사용자를 인증하는 것이 Spring Security의 장점 중 하나라고 생각하는데 세션을 생성하지 않으면 결국 Spring Security를 사용하는 이유가 없지 않나 싶습니다.강사님께서는 아래와 같이 하시지 않았지만 아래와 같이 UserDetail의 아래 메서드들을 true를 두게 되면 인증이 되는 것이기 때문에 세션이 유지된다고 생각하는데 그렇다면 굳이 세션을 유지하면서 JWT를 사용하는 경우도 발생하는 건가요?결국 궁금한 점은 무상태를 위해 JWT를 사용하는데 굳이 Spring Security를 사용하는 이유가 궁금합니다.@Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
맥 사용시 2002 오류 나오실 경우
mysql.server start명령어 사용해보세요 아직원리는 모르겠는데 명령어 사용 후 mysql -u root입력하시면 sql작동 됩니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블이 생성되지 않습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]마지막 사진이 강사님이 실행했을 때, 객체에 맞게 테이블이 자동으로 생성되는 부분입니다. 하지만 저는 테이블이 생성되지 않는데 이유가 무엇인가요?JDBC와 연결이 제대로 되지 않는 것이 원인인 것 같아서 persistence.xml 파일을 다시 확인했는데 잘 모르겠습니다. 설명 부탁드립니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
N:1 단방향, 다대다(1:N 양방향, N:1 양방향) 이 좋은 매핑인 건가요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강사님께서 양방향은 최대한 지양하고 단방향만을 이용해서 설계하고 나중에 굳이 필요하다면 양방향을 추가해라 라고 말씀하셨고 일대다 단방향, 일대일도 지양하고, 다대다는 풀어쓰라고 하셨는데요. 다대다를 풀게 되면 1:N 양방향, N:1 양방향이 되고 결국 연관관계를 설정할 때는 N:1 단방향, 다대다(1:N 양방향, N:1 양방향) 만을 가지고 설계하는 것이 가장 좋은 방법인가요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.order 클래스안에 member와 다대일양방향 메서드를 member.getOrders().add(this)로 작성했는데, order와 delivery 연관관계 편의 메서드에서 delivery.setOrder(this)로 한 이유가 delivery 정보값은 가져올 필요가 없어서 인가요?둘다 정보를 가져와야 하는 것 아닌가 싶어서 질문드립니다.get과 set을 어떤 상황에서 각각 써야 하는건가요??
-
해결됨Practical Testing: 실용적인 테스트 가이드
패키지 구조에 대해서 질문 드리고 싶습니다.
강의 너무 잘들었습니다 강사님 :)도움 너무 많이 되고있습니다“패키지 구조에 대한 질문이라는 글을 읽고서 product 패키지-domain 패키지-service 패키지-repository패키지아니면controller패키지-product패지지service패키지-product패키지어떤게 더 나을지 고민입니당 ㅠ 어떻게 생각하시나요?rest api 서버로 프로젝트를 처음 진행하려고 하는데 어떻게 나눌지를 잘 모르겠어서 검색 키워드나 실무에서는 어떻게 사용하시는지 궁금합니다 ..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속 상태의 객체인 이유, 영속 상태의 객체인 이유
안녕하세요. 강의 내용과 관련하여 질문이 있어 글 남깁니다.강의에서 10:00 정도에 변경 감지 방법에 대해 설명하시는 부분입니다.트랜잭션 상에서 엔티티를 다시 조회하여 내용을 변경하면 이 엔티티는 영속 상태이므로 변경 감지가 된다. 따라서 save() 를 하지않아도 알아서 변경 감지되어 DB에 update된다. 라고 이해했습니다.제가 궁금한 부분은,itemRepository.findOne(itemId); 부분에서 엔티티를 조회하는데, 이 엔티티는 원래 준영속 상태의 엔티티였고, findOne() 을 함으로써 다시 영속성 컨택스트에 들어온 건가요? 아니면 생성된 때부터 지금까지 죽 영속 상태였나요?강의의 맥락상, 지금 준영속 객체를 변경하는 방법에 대해 배우고 있으니 전자일 것이라고 생각했습니다. 만약 제가 생각한대로 준영속 상태에서 변경된 것이 맞다면, merge와 역할 자체는 같은게 맞나요? 물론 디테일한 로직이 좀 다르지만, 역할 자체만 보면 merge또한 준영속 객체를 기발으로 영속 객체를 만들어 반환해주는 거고, 변경 감지 기법도 findOne()을 통해 준영속 객체를 영속 객체로 다시 만들어주는 것이니까요.이 둘의 차이점은 객체가 통째로 갈아치워지느냐, 부분 수정이 가능하냐 이것 정도만 있다, 라고 이해해도 될까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문상품_재고수량초과 테스트 질문있습니다(fail())
[질문 내용]여기서 주문상품수량이 10개니 예외가 터지지않고 fail로 가는거로 알고있는데요 Expected jpabook.jpashop.exception.NotEnoughStockException to be thrown, but nothing was thrown 이러한 에러는 뜨는데 예외가 터지지않았기에 fail이 떠야하는데 fail안에 있는 메세지가 안뜹니다한가지 더 질문이 있씁니다주문상품수량을 11로 바꿧을떄 마지막에 fail을 적지않고 테스트를 돌렸을땐 예외를 터트려서 테스트가 성공적으로 끝나는데요 여기서 위와같이 fail메서드를 적어도 원래는 위에서 예외가 처리됏기떄문에 테스트가 정상적으로 끝나야 되는게 맞는거 아닌가요? 테스트를 돌렷는데 fail문이 뜹니다 그 뜻은 예외가 터지지않았다는 말이죠.. 의문이 듭니다 도와주세요ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
order 후 submit 시 whitelabel 오류 질문
회원 가입등 아무것도 안한 초기 화면에서 주문 내역을 보면 다음과 같이 정상적으로 html이 랜더링 되지만회원가입, 상품 추가, 주문 뒤에 submit 버튼을 누르면 다음과 같은 오류가 생깁니다.코드는 다 확인 해보았으나 오류를 발견하지 못했습니다. 그리고 다른 분들 질문도 참고해보고 수정해보아도 달라지는 건 없었습니다. jpa 초보라 제가 할 수 있는 범위 내에선 오류를 찾아볼려고 노력했으나 역부족인 것 같아 질문드립니다.ㅜ https://drive.google.com/file/d/1ylXiA_HpPpQzUourXkXCCKO4T5dE4Cl3/view?usp=sharing 밑은 오류 코드 입니다.Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Wed Jan 24 23:16:03 KST 2024There was an unexpected error (type=Internal Server Error, status=500).An error happened during template parsing (template: "class path resource [templates/order/orderList.html]")org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1103) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1077) at org.thymeleaf.spring6.view.ThymeleafView.renderFragment(ThymeleafView.java:372) at org.thymeleaf.spring6.view.ThymeleafView.render(ThymeleafView.java:192) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1431) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1167) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1106) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1623) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "item.orderItems[0].item.name" (template: "order/orderList" - line 41, col 13) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) at org.attoparser.MarkupParser.parse(MarkupParser.java:257) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 48 more Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "item.orderItems[0].item.name" (template: "order/orderList" - line 41, col 13) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) at org.thymeleaf.engine.Model.process(Model.java:282) at org.thymeleaf.engine.Model.process(Model.java:290) at org.thymeleaf.engine.IteratedGatheringModelProcessable.processIterationModel(IteratedGatheringModelProcessable.java:368) at org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:222) at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640) at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322) at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164) at org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169) at org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412) at org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473) at org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201) at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ... 50 more Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1025E: The collection has '0' elements, index '0' is invalid at org.springframework.expression.spel.ast.Indexer$CollectionIndexingValueRef.growCollectionIfNecessary(Indexer.java:705) at org.springframework.expression.spel.ast.Indexer$CollectionIndexingValueRef.getValue(Indexer.java:669) at org.springframework.expression.spel.ast.Indexer.getValueInternal(Indexer.java:103) at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:67) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:97) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:114) at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:338) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ... 75 more