묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! Querydsl
querydsl에서 공통 컬럼 조회 질문 있습니다.
모든 Entity는 createdBy(데이터 작성자) 속성을 갖고 있는 BaseEntity 클래스를 상속하고 있습니다. loginId로 createdBy 속성 값과 loginId가 같은 데이터를 가져오는 메소드를 만들고 싶습니다. 이 메소드를 entity마다 전부 만들어줘야할까요? 아래 코드처럼 처리하면 될 줄 알았는데 이렇게 처리하면 에러가 발생하네요ㅜ 방법이 없을까요?public List<Product> getList(String loginId) { List<Product> products = queryFactory.selectFrom(product) .where(QBaseEntity.baseEntity.createdBy.eq(loginId)) .fetch(); return products; }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
IntelliJ Setting 질문입니다...
이런 오류가 생겼는데 어떻게 해결해야 할까요? ㅠㅜ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV에 대해 질문이 있습니다.
질문1커넥션을 많이 사용하지 않는 경우 OSIV를 키고,실시간 요청이 많은 경우는 OSIV를 끈다고 했는데OSIV를 끄는 경우가 스트리밍 서비스나, 채팅 기능에 해당할가요 ?? 질문2질문1의 내용이 맞다면 만약 프로젝트에 게시판, 작성자와 1:1 채팅 기능이 있다면,게시판은 OSIV를 키고, 채팅 기능을 담고 있는 로직들에만 별도로 OSIV를 끄는 옵션이 따로 있나요??아니면 제가 멀티 모듈을 사용한적이 없어 자세히는 모르지만 멀티 모듈을 사용해서 각 기능들을 모듈화해서 따로 옵션을 설정하는건가요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 조회 최적화 - 엔티티 조회 vs DTO 직접 조회
안녕하세요 강의 정말 잘 듣고있습니다.해당 챕터의 마지막 강의인 "API 개발 고급 정리" 영상에서 엔티티 조회 방식과 DTO 직접 조회 방식 중 어떤 것을 더 권장하는지에 대해 설명해주시는 부분에 대해 질문이 생겼습니다.저는 아무래도 DTO 조회 방식은 쿼리문도 까다롭고 DTO를 추가로 만들어야 하기 때문에 우선 손이 잘 안가는 느낌이있었던 반면에,엔티티 조회는 쿼리가 더 단순하고 배치사이즈 옵션으로 쉽게 페이징도 적용할 수 있어서 좀 더 다가오긴했습니다.두 방식에 대한 차이와 장단점을 듣고나서는 네트워크 성능과 컴퓨터 성능이 워낙 좋아져서 엔티티 조회 방식으로 접근해도 거의 충분하다라고 이해를 했는데요.강의를 만드신 시기가 몇년 전인만큼 현재는 시간이 흘러 네트워크 성능과 컴퓨터 성능이 더 발전했는데지금은 엔티티 조회하는 방식만으로 컬렉션 조회하는데 성능 문제가 없을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
print 출력이 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.print 행만 제대로 컴파일이 안되는 것 같은데 왜 그런걸까요... Hibernate: drop table if exists Member cascade Hibernate: drop table if exists Team cascade Hibernate: drop sequence if exists Member_SEQHibernate: drop sequence if exists Team_SEQ6월 16, 2023 6:58:10 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@404eca05] 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: create sequence Member_SEQ start with 1 increment by 50Hibernate: create sequence Team_SEQ start with 1 increment by 506월 16, 2023 6:58:10 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4832f03b] 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: create table Member ( Team_ID bigint, id bigint not null, USERNAME varchar(255), primary key (id) )Hibernate: create table Team ( TEAM_ID bigint not null, USERNAME varchar(255), primary key (TEAM_ID) )Hibernate: alter table if exists Member add constraint FKknpbqg06nqr85nxx8lcw476y0 foreign key (Team_ID) references Team6월 16, 2023 6:58:10 오후 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase beforeScriptINFO: HHH000476: Executing script '[injected ScriptSourceInputNonExistentImpl script]'Hibernate: select next value for Team_SEQHibernate: select next value for Member_SEQHibernate: /* insert for hellojpa.Team */insert into Team (USERNAME,TEAM_ID) values (?,?)Hibernate: /* insert for hellojpa.Member */insert into Member (Team_ID,USERNAME,id) values (?,?,?)Hibernate: select m1_0.id, t1_0.TEAM_ID, t1_0.USERNAME, m1_0.USERNAME from Member m1_0 left join Team t1_0 on t1_0.TEAM_ID=m1_0.Team_ID where m1_0.id=?6월 16, 2023 6:58:11 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]Process finished with exit code 0
-
해결됨실전! 스프링 데이터 JPA
dto와 영속성 관리
안녕하세요 스프링 부트 시리즈를 거의 다 들었는데요,엔티티를 영속성 컨텍스트에서 관리하면 1차 캐시가 생겨서 2번째 조회할 때는 db가 아니라 영속성 컨텍스트에서 가져온다고 알고있는데요그래서 공부하면서 스프링 데이터 jpa랑 querydsl로 회원 조회, 수정, 삭제 등 공부하면서 api 호출로 값을 받을 때 dto를 통해서 받는 로직을 짜고 테스트를 했습니다.member1을 읽은 뒤에 db에서 강제로 이름을 member2로 바꾸고 다시 호출했는데 member2로 잘 읽어 오더라고요 member1을 읽어와서 영속성 컨텍스트에 이미 올라있는 정보를 바로 가져올 줄 알았는데 제 예상이 틀렸습니다.이게 엔티티를 직접 조회한게 아니라 dto를 통해 조회해서 그런건가요? 아니면 혹시 제가 뭘 잘못알고 있는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2데이터 베이스에 데어터가 들어오지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.java 17에 스프링 부트는 3.1.0 버전을 사용중이고h2 데이터 베이스는 최신 버전을 다운 받았습니다.스프링부트 3.0버전 이상은 h2 2.1.214버전 이상 사용하는게 맞나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
궁금한점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영한님 강좌에서 사용했던 소스코드나 교재 내용들 혹시 블로깅 해도되나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 등록 파라미에 대해서 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]상품 주문시에만 파라미터를 @requestParam으로 받으셨는데 특별한 이유가 있는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 에러 질문
안녕하세요 스프링 부트 환경에서 JPA 를 쓸때 이해하지 못하는 에러가 나서 질문합니다.현재 서비스와 레포지토리 레이어를 분리해서 사용하고 있고, @Transactional 어노테이션은 레포지토리 클래스에만 적용해 놓은 상태입니다.우선 save 함수와 findOne 함수는 이런식으로 존재합니다.public void save(Lost entity) {em.persist(entity);} public Optional<Lost> findOne(Long id) {return Optional.ofNullable(em.find(Lost.class, id));} Lost 엔티티는 이런식으로 존재합니다 (더 많은 컬럼이 있지만 필요한 것만 적었씁니다)@Data @Builder @AllArgsConstructor @NoArgsConstructor @Table(name = "lost") @Entity @JsonIgnoreProperties({"organization", "postCodeType"}) public class Lost { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "lost_id") private Long id; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "lost_user_id", referencedColumnName = "user_id", insertable = false, updatable = false) @EqualsAndHashCode.Exclude @ToString.Exclude private User user; }근데 서비스 레이어에서 Lost result = lostsRepository.save(LostMapper.INSTANCE.toEntity(lostRequest)); System.out.println(lostsRepository.findOne(result.getId()).get().getUser());이런식으로 findOne을 해서 user 필드를 가져오려고 하면 null 이 뜹니다ㅠㅠ@ManyToOne(fetch = FetchType.EAGER)이 설정도 잘 해줬고, 커밋도 레퍼지토리에서 해서 그러면 user 필드가 채워져서 와야 할텐데 이해가 안됩니다..ㅠ @ToString.Exclude 문제는 아닌게 getUser 을 해서 봤을때도 null 이 뜹니다. 혹시 뭐가 문제일까요? findOne을 쓰는 다른 곳에서는 잘 동작하는데, 저렇게 save 를 한 직후에 save 한 엔티티 아이디로 findOne을 하면 조인한 다른 객체가 null로 뜹니다. 추가로 우선 해당문제는public void save(Lost entity) {em.persist(entity); em.flush(); em.refresh(entity); }이런식으로 바꿔서 해결했습니다.메커니즘이 이해가 안가서 질문드립니다!!감사합니다
-
미해결실전! 스프링 데이터 JPA
h2 데이터 베이스 연결하는데 오류가 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]h2 데이터베이스를 연결하는 도중에 오류가 발생해서 질문드립니다 처음에 jdbc:h2:~/datajpa 이렇게 해서 연결을 성공해서 jdbc:h2:tcp://localhost/~/datajpa 이렇게 url을 입력을 해서 진행을 했는데 connen timed out이 발생을 합니다 datajpa.mv.db 생성된것도 확인을 하고 gitbash로 권한도 바꿔줬습니다!
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
의존성을 분리하는 건 캡슐화를 깼다고 볼 수 없을까요?
07:05 부근에서 메서드 내에 내부 알고리즘을 확인한 시점에서 캡슐화가 깨졌다는 언급을 해주셨습니다.개인적으로 생각했을 때는 의존성을 분리했을 때 또한 로직이 외부(인자)로 노출되므로 이것도 캡슐화가 깨졌다고 볼 수 있는 것 아닐까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션 커밋시 영속 컨텍스트, 그리고 트랜잭션 커밋과 종료의 차이
트랜잭션이 커밋이 일어나면 영속 컨텍스트가 어떻게 되는지 궁금해서 질문드립니다. 비슷한 질문이 있어 해당 글의 답을 보니, "커밋되는 시점에는 영속성 컨텍스트를 삭제한다."라고 되어있습니다.그런데 어떤 블로그 글에서는 커밋되더라도 영속 컨텍스트의 1차 캐시는 남아있고, 쓰기 지연 SQL 저장소의 내용은 사라진다고 되어있습니다.Q1. 정확히 어떻게 되나요? 그리고 "컨텍스트의 삭제"의 정확한 의미가 이해가 되지않아서 이 부분도 궁금합니다!Q2. 영속 컨텍스트 자체가 삭제되는거라면, 커밋될 때 영속 컨텍스트의 삭제와 엔티티 매니저를 close()할 때 영속 컨텍스트가 닫히는것의 차이가 무엇인지 궁금합니다!Q3. 그리고 트랜잭션 커밋과 종료의 차이가 무엇인지 궁금합니다.찾아보니 "COMMIT을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다"라고 봤는데, 워딩의 차이이지 결국 같은 의미인가요? 아니면 커밋하지않고 트랜잭션이 종료될 수 도 있는건가요?감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속 컨텍스트에서 flush가 발생하는 위치 혹은 순서
3강 영속성 관리를 공부하다가 flush에 관해 궁금한게있어 질문남깁니다.3강 강의자료에서 21페이지를 보시면 트랜잭션이 커밋될 때, flush가 발생하는것을 설명하면서 '2.flush'가 영속 컨텍스트에서 DB를 향하고있습니다. 그런데 23페이지 변경감지에서 flush가 발생하는것을 설명할때 그림을 보면, '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있고, '4.flush'가 쓰기 지연 SQL 저장소에서 DB를 향하고있습니다. Q1. 전자(21페이지)는 flush가 한 번 발생하는데, 후자(23페이지)는 두 번 발생합니다. 둘 다 커밋할 때 발생하는건데 왜 차이가있는지 궁금합니다. 사실상 후자처럼 두 번 발생하는게 맞다고 보면 되나요? Q2. 변경감지 설명에서의 '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있습니다. 이는 변경감지에서 가장 먼저 flush()가 발생한것인데, flush는 쿼리를 날리며 "영속성 컨텍스트의 변경내용을 데이터 베이스에 반영"하는것이라고 배웠습니다. 그럼 결국 더티체킹이 일어나기 전, 쿼리가 처음부터 날라가는건가요? 그렇다면 사실상 쿼리가 두 번 날라가는 건가요?아니라면 이 '1.flush()'는 뭔가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의를 다 듣고난 후 YAML 설정파일 관련 궁금한 부분이 있습니다.
각 마이크로서비스 내에서도 application.yml을 두고,config service으로 부터 읽어오는 설정파일을 지정할 수 있다는 부분을 강의를 통해 배웠습니다. 1) 제가 궁금한 부분은 애플리케이션 내부 설정파일과 config service가 읽어오는 설정파일에 적는 정보는 어떤 기준으로 나뉘나요? 즉, 어떠한 정보를 애플리케이션 내부 설정파일에 두며, 어떤한 정보는 애플리케이션 내부 보다는 config-service로 부터 읽어들이는 설정파일에 정보를 두게되는 기준이 있으실까요?2) 또 다른 궁금점은 꼭 필요한 설정을 제외하고는 대부분의 설정 정보를 config-service로부터 읽어오는 설정파일에 넣어놔도 괜찮나요?? 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@JoinTable @JoinColum 옵션을 통한 외래키 선언 순서
M:N 관계를1:M과 M:1 관계로 풀어내는 @JoinTable 애노테이션의 옵션중joinColumns와 inverseJoinColumns를 지정하는 구분 기준은 따로 없고두개의 선언을 서로 다르게 선언해도 상관없나요??@JoinTable(name = "CATEGORY_ITEM" , joinColumns = @JoinColumn(name = "CATEGORY_ID") , inverseJoinColumns = @JoinColumn(name = "ITEM_ID") )@JoinTable(name = "CATEGORY_ITEM" , joinColumns = @JoinColumn(name = "ITEM_ID") , inverseJoinColumns = @JoinColumn(name = "CATEGORY_ID") 위와 같이 순서를 다르게 지정하면 JoinTable의 컬럼의 순서만 변경 되는것인가요?두 컬럼의 순서는 인덱스에만 영향을 줄 뿐 데이터 조회결과에는 영향을 미치지 않을거라 예상되는데 맞나요?따라서 다이어그램의 순서상으로 따진다면 CATEGORY_ITEM을 기준으로 ITEM테이블이 먼저 나오고 반대방향이 CATEGORY으로 이해하려고 하였으나 그 반대인거 같습니다.선생님께서 선언하신 순서는 어떤 기준대로 순서를 이해 해야 할까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO에 관해서 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]DTO를 만들때강의에서는 하나의 클래스에서 inner 클래스로 DTO를 만드셨는데 실제 실무에서도 이러한 방식으로 하는지 궁금합니다. 그리고 컨트롤러에서 람다와 스트림을 통해서 데이터 정제 하는 로직은 컨트롤러에서 처리해도 상관이 없는지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
19:04 초 where in 쿼리 대신 where array_conatins 쿼리가 나왔습니다. (스프링 부트 3.1)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]현재 스프링 부트 3.1 로 강의를 따라가고 있습니다.default_batch_fetch_size:10 을 설정해서 나가는 쿼리가 줄어드는 것을 확인했습니다만, 쿼리가 두 개가 아니고 총 세 개가 나왔습니다.023-06-13T23:24:02.666+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.memeber_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only 2023-06-13T23:24:02.676+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242676 | took 2ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select o1_0.order_id,d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status,m1_0.memeber_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only select o1_0.order_id,d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status,m1_0.memeber_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset 0 rows fetch first 100 rows only; 2023-06-13T23:24:02.681+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select o1_0.order_id, o1_0.order_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) 2023-06-13T23:24:02.689+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242689 | took 0ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select o1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) select o1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_price from order_item o1_0 where array_contains('ar2: ARRAY [CAST(1 AS BIGINT), CAST(2 AS BIGINT), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL]',o1_0.order_id); 2023-06-13T23:24:02.690+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.category_item_id, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn, i1_0.artist, i1_0.etc from item i1_0 where array_contains(?,i1_0.item_id) 2023-06-13T23:24:02.691+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242691 | took 0ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select i1_0.item_id,i1_0.dtype,i1_0.category_item_id,i1_0.name,i1_0.price,i1_0.stock_quantity,i1_0.author,i1_0.isbn,i1_0.artist,i1_0.etc from item i1_0 where array_contains(?,i1_0.item_id) select i1_0.item_id,i1_0.dtype,i1_0.category_item_id,i1_0.name,i1_0.price,i1_0.stock_quantity,i1_0.author,i1_0.isbn,i1_0.artist,i1_0.etc from item i1_0 where array_contains('ar3: ARRAY [CAST(1 AS BIGINT), CAST(2 AS BIGINT), CAST(3 AS BIGINT), CAST(4 AS BIGINT), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL]',i1_0.item_id); 수강 중에 제가 따라 작성한 코드를 스프링부트 2.4.1에 그대로 옮겨보니 강의 내용대로 where in 쿼리가 나오는 것을 확인했습니다.스프링부트 버전 차이에서 나오는 쿼리가 달라진 것 같은데, 제 생각이 맞을까요? 답변 확인 : 빠르게 답변해주셔서 감사합니다!!덕분에 array_contains 로 최적화된 이유를 쉽게 이해할 수 있었습니다. (Hibernate에서 최적화를 했었었군요!)아 그리고 강의 내용에서 쿼리 세 개 나온다는 것을 확인했습니다(잘못 본 것에 대해 질문글에서 수정을 해놨어야 했는데 빼놓지 않았었네요 ㅠㅠ)다시 한번 상세한 답변 정말 감사드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링부트 버전에 따른 SQL 문이 다른 점 (Alias 유무)
안녕하세요, 스프링부트 3.1로 강의를 듣고 있는 학생입니다.3.1.0 버전에서는 Select 쿼리를 생성할 때 별칭(alias) 없이 생성되었는데JPA hibernate 버전 차이가 원인인 것인가요?문서를 찾아보려고 해도 어떻게 찾아야 할지 감이 오지 않아서 질문드립니다.아래는 MemberServiceTest 회원가입 test 의 로그입니다.3.1.02023-06-13T22:26:00.567+09:00 DEBUG 64058 --- [ Test worker] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.name=? 2023-06-13T22:26:00.571+09:00 DEBUG 64058 --- [ Test worker] org.hibernate.SQL : select next value for member_seq2.4.12023-06-13 22:23:43.684 DEBUG 63945 --- [ Test worker] org.hibernate.SQL : select member0_.member_id as member_i1_0_, member0_.city as city2_0_, member0_.street as street3_0_, member0_.zipcode as zipcode4_0_, member0_.name as name5_0_ from member member0_ where member0_.name=? 2023-06-13 22:23:43.691 DEBUG 63945 --- [ Test worker] org.hibernate.SQL : call next value for hibernate_sequence아래는 각 로그가 출력할 때 사용한 파일입니다.2.4 버전https://drive.google.com/file/d/1BhS1ZjixkOKzQxrEaSLGu0o6tWGhRLr_/view?usp=sharing3.1 버전https://drive.google.com/file/d/1SN6W0iq6X2ALHPNJDUgXuG-ep3-D4UyU/view?usp=sharing
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
3개의 서비스 실행 시 데이터베이스 에러 발생
영상에서 실제 실행할 떄 3개의 서비스인 User, Catalog, Order 서비스를 정상적으로 실행하는 것을 보았습니다.그런데 저는 하나의 서비스를 실행한 후 다른 서비스를 실행하면Unable to open JDBC Connection for DDL execution [Database may be already in use: "C:/경로/ecommerce.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-214]] [n/a]이미 데이터베이스가 연결 중이니 다른 커넥션을 닫거나 서버모드를 사용하라는 에러가 발생합니다.서버모드로 해결했는데 혹시 다음 강의에서 충돌이 발생할 가능성이 있을까요??필자의 정보h2 버전 : 2.1.214h2 데이터베이스 엔진을 다운받아 임베디드 모드로 데이터베이스 생성했습니다.