묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
Spring Data JPA delete 관련 질문
제가 따로 구현하지 않고Spring Data JPA JpaRepository 에서 상속받은deleteById 를 사용하면먼저 select query 가 1번 나간 다음에 찾아온 Entity로 delete 메서드를 호출하는 것 같더라구요그래서 총 select, delete 쿼리가 각각 1번 총 2번 나가는 것 같은데 PK로 delete 를 하고 싶을 때,@Query로 작성하여 delete 문을 1번 나가게 하는 것과,위의 방법대로 select, delete 각각 1번 나가는 방법 중에 어떤 방법을 사용하는 것이 좋은가요 ?
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인터셉터 활용?
안녕하세요 호돌맨님!JWT 관련 강의에서 ArgumentResolver를 활용해 토큰 검증을 하고 사용자 정보를 추출해 반환하셨는데, 만약 프로젝트를 진행할 때 로그인을 해야 모든 URL에 접근할 수 있다고 한다면 아래 코드처럼 인터셉터에서 토큰 검증을 하고 ArgumentResolver에선 별다른 검증 없이 subject만 추출해서 반환해도 문제가 없을까요? 혹시 제가 접근 자체를 잘못하고 있다면 알려주시면 감사하겠습니다@Slf4j @RequiredArgsConstructor public class LoginCheckInterceptor implements HandlerInterceptor { private final JwtService jwtService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String requestURI = request.getRequestURI(); log.info("인증 체크 인터셉터 실행 {}", requestURI); String accessToken = request.getHeader("Authorization"); jwtService.validateAccessToken(accessToken); try { jwtService.getSubject(accessToken); } catch (JwtException e) { throw new Unauthorized(); } return true; } } @RequiredArgsConstructor public class JwtArgumentResolver implements HandlerMethodArgumentResolver { private final JwtService jwtService; @Override public boolean supportsParameter(MethodParameter parameter) { boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); boolean hasLoginType = LoginUser.class.isAssignableFrom(parameter.getParameterType()); return hasLoginAnnotation && hasLoginType; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { String accessToken = webRequest.getHeader("Authorization"); Long userId = jwtService.getSubject(accessToken); log.info("userId = {}", userId); return new LoginUser(userId); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 눌러도 반응이 없어요. 도와주세요 ㅠ
연동을 다해놨는데, 스프링 실행할때 에러가 나네요.. 이유를 못찾겠습니다.구글 드라이브에 올릴게요강의는 회원등록 4분46초 부분 하고 있었습니다. https://drive.google.com/file/d/1Xes5ztWKL5s4NDre1bSuGeL2t-tbnJIO/view?usp=sharing
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 관계 까지 수업듣고 질문 드립니다. (fk를 pk설정)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예시로 드신 Member_Product 테이블의 관계는 주문 테이블이라고 이해가 되는데 이럴경우에는 fk 2개를 pk설정을 하면 중복된 값이 못들어와서 당연히 기본키를 하나 만들어 주는걸로 배웠는데 만약에 주문이 아니고 수강테이블처럼 중복된 값을 막아야 하는 경우에도 테이블 내에 pk를 하나더 만들어 주는게 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
실무에서는 그럼 spring.jpa.open-in-view: false 로 설정하는 경우가 많은가요 ?
실무에서spring.jpa.open-in-view: false로 설정하는 경우가 많은가요 ? 또한 사이드 프로젝트 정도로 규모가 작을 경우그냥 기본 설정대로 true로 사용해도 되나요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]트랜잭셔널 어노테이션을 레포지토리나 컨트롤러가 아니라 서비스에 붙이는 이유가 있나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
배치처리를 하려면 어떻게 해야하나요?
스프링이 제공하는 기능이 아니라 제가 직접해줘야하는건가요? 영속성 컨텍스트가 일정이상 차면 비워주는 작업을 어떻게 할 수 있을까요?코드가 나와있긴하지만 그 코드는 너무 로우 레벨아닌가요?? SPRING DATA JPA사용하면서 em을 직접적으로 사용하진 않잖아요..자동으로 해주는건가요...?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 벗기기가 언제 필요하나요?
어떤 상황에서 하이버네이트가 제공하는 프록시벗기기가 필요한가요?(프록시 객체에서 원본객체를 가져오는 메서드가 필요한 상황)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드 작성할때 주문수량 8에서 10
주문기능테스트 8분 59초 보면8개로 했다가 10개로 바꾸면 에러 나는데 h2 db에 해당 데이터를 확인할 수 가 없어서요해당 테스트 한 데이터 값 남게하려면 어떤 어노테이션을 사용했는데 그게 뭘까요 ?그리고 제가 알기론 테스트는 한번실행하고 나서 다시 초기화 시켜주는 걸로 알고 있는데 어떻게 8개 했다가 10으로 바꿨다고 에러가 나는 건가요 ? 강의를 아무래도 병행하다 보니 드문드문 띄게 되네요 이런게 강의자료에도 잘 설명이 되면 더 좋을텐데 스프링 문법이 안써있어서 너무 아쉬워요 책을 사야 할까요 ?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
osiv관련 질문
osiv가 뷰에서도 지연로딩이 가능하게 하려고 도입한거잖아요 (뷰에서 필요한값들을 지연로딩으로 가져오려고)근데 지연로딩을 하면 결국 필요없는 쿼리가 추가로 나가게될텐데..애초에 필요한 데이터만 jpql사용해서 뽑아서 주면 문제가 해결되는거아닌가요? 왜osiv를 사용하는거죠?? 뷰와 리파지토리가 너무 연관되어서 그런가요..? 그게 그렇게 큰 단점인가요..?뭔가 osiv의 장점이 엄청많아보이는데 제가 다른 분들 프로젝트를 봤을때는 osiv를 거의 적용안했던것같거든요... 왜 잘 안쓰이는걸까요...
-
미해결실전! 스프링 데이터 JPA
페이지를 유지하면서 엔티티를 DTO로 변환관련하여 질문
스프링 데이터 JPA 페이징과 정렬 강의 부분에서페이지를 유지하면서 엔티티를 DTO로 변환하기Page<Member> page = memberRepository.findByAge(10, pageRequest); Page<MemberDto> dtoPage = page.map(m -> new MemberDto());페이지를 유지하면서 엔티티를 DTO로 변환하는 예제가 있습니다.만약에 아래와 같이 Page<Member> page = memberRepository.findByAge(10, pageRequest); List<Member> dtoPage = faqListPage.stream().map(MemberDto::new) .toList();List<> 로 반환하여 페이징 처리를 하였는데 페이지를 유지한 첫번째 방식 차이점이 있을까요??실무에서는 어떤 방식을 사용하나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
[13강] application.yml 파일 설정에서 문제가 있습니다.
강사님이 설명 해 주시는 대로 정말 다 따라했는데 안돼요.. 사용자 정보가 db에 등록이 안되어서 뭐가 문제인지 살펴봤는데아래 driver-class-name 경로가 인식이 안됩니다..강사님은 ctrl 누르고 클릭하면 파일 경로로 이동이 되시던데 전 안되네요.. 나름대로 구글링 해서 해결책을 찾아봐서 몇 개 시도해 봤습니다. mysql connector 파일 따로 다운받아서 java 11 버전 lib 파일에 옮기고외부 라이브러리 추가 해 줬습니다. build.gradle 파일에 의존성 코드도 추가해줬습니다. 그런데 해결이 안되네요...뭘 잘못했나 싶어서 파일 새로 다운받고 강의도 처음부터 다시 들으면서 따라했는데 소용없고 mysql도 원래 깔려있었어서 지우고 다시 깔았습니다.서버 run 하면 오류 안 뜨고 잘 돌아가고 웹 사이트도 접속이 잘 되는데 db 저장만 안 됩니다.. 런 로그입니다..오후 6:26:28: Executing ':LibraryAppApplication.main()'...> Task :compileJava UP-TO-DATE> Task :processResources UP-TO-DATE> Task :classes UP-TO-DATE> Task :LibraryAppApplication.main(). ____ _/\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.7.6)2023-05-30 18:26:34.455 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : Starting LibraryAppApplication using Java 11.0.17 on DESKTOP-A2F7K18 with PID 268 (C:\Users\djxka\Desktop\library-app\build\classes\java\main started by djxka in C:\Users\djxka\Desktop\library-app)2023-05-30 18:26:34.460 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : No active profile set, falling back to 1 default profile: "default"2023-05-30 18:26:35.842 INFO 268 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.2023-05-30 18:26:35.884 INFO 268 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 18 ms. Found 0 JPA repository interfaces.2023-05-30 18:26:37.789 INFO 268 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2023-05-30 18:26:37.808 INFO 268 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2023-05-30 18:26:37.809 INFO 268 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.69]2023-05-30 18:26:38.079 INFO 268 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2023-05-30 18:26:38.080 INFO 268 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3479 ms2023-05-30 18:26:38.455 INFO 268 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2023-05-30 18:26:39.011 INFO 268 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.2023-05-30 18:26:39.095 INFO 268 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]2023-05-30 18:26:39.259 INFO 268 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.14.Final2023-05-30 18:26:39.640 INFO 268 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}2023-05-30 18:26:39.960 INFO 268 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect2023-05-30 18:26:40.429 INFO 268 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]2023-05-30 18:26:40.451 INFO 268 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'2023-05-30 18:26:40.540 WARN 268 --- [ main] 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 warning2023-05-30 18:26:41.279 INFO 268 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2023-05-30 18:26:41.300 INFO 268 --- [ main] c.g.libraryapp.LibraryAppApplication : Started LibraryAppApplication in 8.059 seconds (JVM running for 9.476)2023-05-30 18:26:49.558 INFO 268 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2023-05-30 18:26:49.559 INFO 268 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2023-05-30 18:26:49.561 INFO 268 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms 도와주세요ㅠㅜㅠㅜ
-
해결됨Practical Testing: 실용적인 테스트 가이드
마이바티스와 테스트 코드
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요 강사님 강의 너무 잘 듣고있습니다. 회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다. JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요.. 만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요? 테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..) Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다. 이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?) 회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다.. 좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa 영속성 컨텍스트 질문입니다.
em.persist(member1); em.persist(order1); em.persist(order2); em.flush(); em.clear(); <-- order1 내용 변경 --> em.persist(order1); tx.commit()flush와 clear까지 하면 db에 반영은 되어있고 order1의 내용을 조금 바꾼뒤 persist하면 1차 캐시에 올라가있을텐데, commit을 하면 실제 db에 아무것도 뜨지 않습니다.em.clear 주석 하고, 내용 변경 후 em.persist의 유무와 상관없이 db에 잘 반영이 됩니다.clear와 persist 사이의 무슨 관계가 있는 것 같은데, db에 아무것도 뜨지 않는 이유가 뭔가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계 편의 메서드 하는 이유
안녕하세요, 양방향 연관관계 편의 메서드를 하는 이유는 순수한 객체 상태에서 봤을 때 양쪽에 값이 있어야 하기 때문인걸로 이해를 했습니다.order와 member가 다대일인 관계라 했을 때,보통 멤버를 db에서 find해서 쓸텐데, 이러면 member에서의 orderList를 가지고 오려면 연관관계 편의 메서드 와는 상관없이 db에서 join을 해서 가지고 오더라구요,,보통 프로젝트나 현업에서 순수한 객체 상태에서 쓸 일이 있나요?아니면 연관관계 편의 메서드를 썼을 때 다른 이점이 있나요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
도메인 테스트 코드 작성을 해봤습니다.
도메인//Order 도메인 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor public class Order { @Enumerated(EnumType.STRING) private OrderStatus status; @OneToMany(mappedBy = "order",cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); /* 주문 취소 */ public void cancel(){ this.setStatus(OrderStatus.CANCEL); /** 재고 원복 */ for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } }//OrderItem public class OrderItem { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; public void cancel() { getItem().addStock(count); // 재고수량을 늘려준다. } }//Item public class Item { private int stockQuantity; public void addStock(int quantity) { this.stockQuantity += quantity; } }불필요한 코드는 제거 했습니다. 테스트 코드@DisplayName("주문을 생성하고, 주문 취소시 주문 취소로 상태를 변경하고, 감소된 상품 재고를 수량을 추가한다.") @Test void cancelOrder(){ //given OrderItem orderItemMock1 = Mockito.mock(OrderItem.class); OrderItem orderItemMock2 = Mockito.mock(OrderItem.class); BDDMockito.doNothing().when(orderItemMock1).cancel(); BDDMockito.doNothing().when(orderItemMock2).cancel(); //OrderItem 가변인자는 내부에서 List로 보관 Order order = Order.createOrder(orderItemMock1,orderItemMock2); //when order.cancel(); //then assertThat(order.getStatus()).isEqualByComparingTo(OrderStatus.CANCEL); Mockito.verify(orderItemMock1,Mockito.times(1)).cancel(); Mockito.verify(orderItemMock2,Mockito.times(1)).cancel(); }Order 도메인의 cancel()을 테스트 코드를 작성해야한다고 할때cancel 호출로 변경된 상태(enum)와내부 List<OrderItem> 필드에 하나씩 취소 요청을 할때Mock으로 OrderItem 도메인을 만들고 호출을 했는지만 검사를 했습니다. Mock 객체를 만드니까 간단한 단위테스트 인데도 속도가 많이 느려지더라구요이런 경우에Order.cancle 로직에 대한 테스트이기 때문에 나머지는 Mock으로 처리관련된 OrderItem.cancle(),Item.addStock()은 별도 단위테스트로 검증했기때문에추가 검증이 필요없다.Order.cancle 로직에 대한 테스트이지만,OrderItem.cancle(),Item.addStock() 테스트 검증이 끝났다고 해도비즈니스 계층 통합테스트 느낌으로 given에서 데이터를 준비하고연관된 데이터를 전부 검증한다. 1번으로 할경우 테스트 목적은 한눈에 들어오지만2번으로 할경우 이 로직이 어디까지 관련이 되어있는지 테스트 코드로 알수 있을거같아서강사님이 말씀하신 테스트를 문서처럼 사용할 수 있는거같습니다. 고민을 해보니 Order.cancel()은 서비스 계층에서 호출을 할텐데1번으로 테스트를 하고, 서비스 계층에서 통합 테스트를 하는게 맞을까요?더 나은 방법이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Service에 @Transactional(readOnly=true)는 필수적으로 넣어줘야 하는 것인지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]클래스 영역에서 트랜잭션을 걸어두는 것이 필수적인 내용인지 궁금합니다! 실무에서도 마찬가지로 동일하게 클래스 영역에 사용해서 적용하게 되는 것일까요?저는 작업할 때 수정이 필요한 메서드에만 @Transactional을 선언해줬었는데 이렇게 처리했던 부분들이 잘못된 부분이었던 것인지 고민이 되어 질문드리게 되었습니다.정리하자면클래스단에서 무조건 '@Transactional(readOnly=true)' 를 작성해주는 것을 권장한다면 그렇게 해야하는 이유가 무엇인지 궁금하고,무조건 걸었을 때 매번 '@Transactional(readOnly=true)' 값을 작성해줘야 하는데 매번 작성하지 않을 수 있는 방법은 없을지 궁금합니다.감사합니다!
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Spring boot + Vue 배포
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세요.문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.안녕하세요! 강의 보면서 저만의 프로젝트를 열심히 만들어보고 있습니다.다름이 아니라 호돌맨님 프로젝트와 비슷하게 프로젝트 폴더 아래 front와 src (Springboot)가 따로 있는 상황이어서 인터넷을 찾아보며 vue build 결과물 (dist 폴더)를 src/main/resources/static/ 에 넣고 배포하는 식으로 진행해보았습니다.위 처럼 했을 때는 5173 => 8080 이 서로 통신하는게 아닌게 되버린 것인지 Vue에서 작성했던 코드들이 정상적으로 작동하지 않아 문제를 겪고있습니다.그 외에도 다른 글들을 참고하면서 build를 해보면 build 과정에서 오류가 발생하는 상황입니다.제대로 동작하게 배포를 하고 싶은데,vue 부분을 따로 배포하는 것 말고는 방법이 없을까요?좀 오랫동안 삽질하게 되어 질문드립니다... 방향이나 참고할만한 내용이 있을까요...?git - https://github.com/ppusda/NyangMunity
-
해결됨실전! 스프링 데이터 JPA
[스프링 데이터 JPA 페이징과 정렬] left join 쿼리
MemberRepositorypublic interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findMemberByUsernameAndAgeGreaterThan(String username, int age); ... @Query(value = "select m from Member m left join m.team t", countQuery = "select count(m.username) from Member m") Page<Member> findByAge(int age, Pageable pageable); } MemberRepositoryTestpackage hello.datajpa.repository; ... @SpringBootTest @Transactional @Rollback(false) class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired TeamRepository teamRepository; ... @Test public void paging() { for (int i = 1; i <= 5; i++) { Member member = new Member("member" + i, 10); memberRepository.save(member); } int age = 10; PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); Page<Member> page = memberRepository.findByAge(age, pageRequest); List<Member> content = page.getContent(); long totalElements = page.getTotalElements(); int totalPages = page.getTotalPages(); int currentPage = page.getNumber(); boolean isFirst = page.isFirst(); boolean hasNext = page.hasNext(); assertThat(content.size()).isEqualTo(3); assertThat(totalElements).isEqualTo(5); assertThat(totalPages).isEqualTo(2); assertThat(currentPage).isEqualTo(0); assertThat(isFirst).isTrue(); assertThat(hasNext).isTrue(); } } Memberpackage hello.datajpa.entity; ... @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) /*@NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username" )*/ public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username, int age) { this.username = username; this.age = age; } public Member(String username, int age, Team team) { this.username = username; this.age = age; changeTeam(team); } public void changeTeam(Team team) { if (team == null) throw new RuntimeException("Member.changeTeam: team is null"); this.team = team; team.getMembers().add(this); } } 쿼리select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 order by m1_0.username desc offset ? rows fetch first ? rows only select count(m1_0.username) from member m1_0강의와 다르게 left join을 해도 left join 관련 쿼리가 나가지 않는데 뭔가 강의와 다르게 설정된 부분이 있는 걸까요?@SpringBootTest @Transactional @Rollback(false) class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired TeamRepository teamRepository; ... @Test public void paging() { Team team = new Team("A"); teamRepository.save(team); for (int i = 1; i <= 5; i++) { Member member = new Member("member" + i, 10); member.changeTeam(team); memberRepository.save(member); } int age = 10; PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); Page<Member> page = memberRepository.findByAge(age, pageRequest); List<Member> content = page.getContent(); assertThat(team).isSameAs(content.get(0).getTeam()); // team == content.get(0).getTeam() ? long totalElements = page.getTotalElements(); int totalPages = page.getTotalPages(); int currentPage = page.getNumber(); boolean isFirst = page.isFirst(); boolean hasNext = page.hasNext(); assertThat(content.size()).isEqualTo(3); assertThat(totalElements).isEqualTo(5); assertThat(totalPages).isEqualTo(2); assertThat(currentPage).isEqualTo(0); assertThat(isFirst).isTrue(); assertThat(hasNext).isTrue(); } } 테스트 코드를 위와 같이 변경했을 때 left join 쿼리나 select 쿼리가 나가지 않고 assertThat(team).isSameAs(content.get(0).getTeam()) 테스트는 통과됩니다.위 코드는 이런 식으로 동작하는게 맞을까요?fetch join이 아니기 때문에 하이버네이트는 일단 member만 가져오는 쿼리를 날리고 레코드를 받아온다.받아온 레코드와 영속성 컨텍스트를 비교한다.받아온 레코드가 영속성 컨텍스트에 엔티티로 존재하므로 영속성 컨텍스트에 있는 엔티티를 반환한다.따라서 조회한 content.get(0) 객체에는 team 필드가 이미 할당 되어 있다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
7강. 유저 생성 API 개발 질문있습니다.
안녕하세요현재 7강. 유저 생성 API 개발 의 9분 듣고있습니다.국비 프로젝트에서 dto에 직접 저장을 했던 경험이 있습니다.선생님께서는 dto에 패키지의 UserCreateRequest에 저장하지 않고 domain패키지에 User라는 객체를 따로 만들어서 저장하시더라구요.그렇게 하는 이유를 알려주실 수 있을까요?