묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
스프링부트에서 MariaDB 연동 관련 에러
안녕하세요. 스프링부트 프로젝트를 아래와 같이 생성하고, DB 정보를 application.yml에 기재하였음에도 아래와 같은 에러가 뜨는데 도저히 해결이 안되네요... 도움 부탁드립니다 ㅠ Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'} spring: datasource: hikari: data-source-class-name: org.mariadb.jdbc.Driver # jdbc-url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&characterEncoding=UTF-8 jdbc-url: jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC username: test password: 1229 connection-test-query: SELECT 1
-
해결됨실전! 스프링 데이터 JPA
Entity 사용에 대한 질문
안녕하세요. 강사님 먼저 항상 좋은 강의를 해주셔서 감사합니다. 제가 실무에서는 Mybatis만 사용하다, 강사님 강의를 통해서 처음 JPA를 접하고, 개인 프로젝트에서 처음 JPA를 사용하고 있습니다. 강의에서 Entity를 직접 반환을 하면 안된다고 하신걸로 기억을 하는데, API 개발 시 리턴을 할 때만 직접 Entity로만 반환을 하면 안되지는 일반 MVC 형태의 개발을 할 때는 직접 Entity를 반환하는 방식을 실무에서 사용을 하시는지 궁금합니다. 저는 평소 Controller에서 파라미터를 받을 때 @ModelAttribute를 이용해 DTO를 통해 파라미터를 받는 방식을 주로 이용하는데, JPA 사용 시 @ModelAttribute를 이용하여 직접 Entity를 받는 방식은 좋은 방식인지 궁금하여 질문 드립니다. 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
DDD 애그리거트 에서 JPA 지연로딩 전략이 궁금합니다.
안녕하세요! 영한 선생님 스프링 클라우드와 JPA를 사용하여 간단한 마이크로서비스 구축을 하는 연습을 하는 도중 궁금증이 생겨서 질문을 올리게 되었습니다. 예를 들면 대출 (Rental)이라는 애그리거트는 반납도서와 대출도서라는 엔티티를 연관관계로 맺고 있습니다. 대출 (1) ---- (N) 반납 도서 대출 (1) ---- (N) 대출 도서 영속성 전이(cascade) + 고아 객체(orphanRemoval)를 통해서 대출 애그리거트 를 통해서 반납 도서와 대출 도서를 생명주기를 관리하고 있습니다. 제가 궁금한 점은 지연로딩 전략을 사용해서 컬렉션 패치 조인을 사용할 때 너비로든 깊이로든 2개 이상의 컬렉션 페치조인을 사용하면 안된다고 알고 있습니다. 그럼 지연로딩 전략을 통해서 대출과 반납도서 대출도서를 조회해오는 방법은 어떻게 하면 좋을지 고민입니다. 대출과 반납도서를 먼저 페치조인으로 조회해오고 다음 대출에 속한 대출 도서를 조회해오면 된다고 생각하고 있습니다. -> 대출에 속한 대출 도서를 조회할 때는 리포지토리를 통해 조회하는게 좋을까요 아니면 대출 애그리거트에서 대출 도서를 사용하는 시점에 초기화해서 사용하는게 좋을까요?? 또 궁금한 점이 애그리거트 루트 패턴을 사용할 때는 애그리거트에 대한 리포지토리만 생성하고 하위 엔티티에 대한 리포지토리를 생성할 필요가 있는지 궁금합니다. 질문을 두서 없이 작성한 거 같아서 정리하자면 1. 애그리거트 루트 패턴을 사용할 때 애그리거트에서 2개의 컬렉션 (지연 로딩) 조회 전략 2. 애그리거트 루트 패턴을 사용할 때의 리포지토리 생성전략 3. 영속성 전이와 고아 객체를 통해 자식의 생명주기를 관리하고 있는데 자식리포지토리를 조회용으로 생성해도 되는지?? 입니다.! ---------- 추가 상품 서비스와 주문 서비스에서 주문 가능한 상품이 여러개라고 할 때 주문 (1) - 주문_상품 (N) ||(서비스 분리) 상품 으로 만들어지고 주문_상품이라는 엔티티에서 상품의 ID를 가지고 있으면 된다고 생각합니다. 만약 어떠한 주문의 주문 상품목록을 조회한다고하면 주문 서비스에서 주문_상품의 ID 리스트를 Feign-Client 같은 동기 API 호출을 통해서 상품 서비스에서 IN 쿼리로 상품들의 정보를 조회한 뒤에 응답을 받고 응답 받은 데이터를 클라이언트에게 보내주는 방법이 맞는지 궁굼합니다. 정리하자면 주문서비스에서 주문한 상품의 목록에 대한 정보를 클라이언트에게 보내줄 때 상품 서비스에서 상품 Id List를 IN쿼리로 조회를 해서 응답하는 것이 맞는지 입니다!
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v2 api의 delivery 쿼리 조회문
안녕하세요 영한님! 간단한 주문 조회v2 질문이 있습니다. @GetMapping("/api/v2/simple-orders")public Result ordersV2() { List<Order> orders = orderService.findAll(new OrderSearch());//프록시가 들어있는 orde 객체 List<SimpleOrderDto> collect = orders.stream().map(o -> new SimpleOrderDto(o.getId(), o.getMember().getName(), o.getOrderDate(), o.getStatus(), o.getDelivery().getAddress())). collect(Collectors.toList()); return new Result(collect);} 위의 v2 api를 실행하면 문제없이 5개의 쿼리문이 나가는 것을 확인했습니다. name을 조회하는 쿼리는 예상했던데로 단순 조회 쿼리인 select member0_.member_id as member_i1_5_0_, member0_.city as city2_5_0_, member0_.street as street3_5_0_, member0_.zipcode as zipcode4_5_0_, member0_.name as name5_5_0_ from member member0_ where member0_.member_id=? 와 같이 나가지만. delivery 엔티티에 접근할때 select delivery0_.delivery_id as delivery1_2_0_, delivery0_.city as city2_2_0_, delivery0_.street as street3_2_0_, delivery0_.zipcode as zipcode4_2_0_, delivery0_.status as status5_2_0_, order1_.orders_id as orders_i1_6_1_, order1_.delivery_id as delivery4_6_1_, order1_.member_id as member_i5_6_1_, order1_.order_date as order_da2_6_1_, order1_.status as status3_6_1_ from delivery delivery0_ left outer join orders order1_ on delivery0_.delivery_id=order1_.delivery_id where delivery0_.delivery_id=? 위와 같이 외부 조인문이 나가는 것을 확인했습니다. 마치 패치조인을 한거 같은 전혀 예상치 못한 쿼리문이여서 질문을 드립니다. 또한 모두 lazy로 설정을 했습니다. 혹시 데이터베이스의 방언차이 때문일까요? mysql 사용중입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
EntityManager 는 왜 AutoCloseable 을 지원하지 않나요?
안녕하세요 문득 궁금한점이 생겨서 질문해봅니다. 항상 사용하고 버려야 한다면 AutoCloseable 지원하여 try-with-resource 문을 사용할 수 있도록 도움을 주면 좋을 것 같다고 생각이 들었지만 시용해볼려고 하니 지원하지 않고있습니다. 이에 따른 이유가 혹시 있는지 궁금해서 질문해봅니당.!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
401 Unauthorized
postman으롷 127.0.0.1:port로 /login 호출 시에 401에러가 나는데 왜그런걸까요..? login api 호출 시 loadUserByUserName 메서드 타서 user정보 가져오는거까진 디버그로 확인했는데, 해당 값 user로 감싸서 리턴 후에 응답이 저렇게 나오는데 이유를 모르겠네요.. 참고로 permitAll로 진행중입니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
getTotalPrice같은 조회함수가 왜 필요한지 모르겠씀니다=_=
totalPrice라는 변수를 만들어서 처음 주문 들어왔을떄 계산해서 넣어두고, 주문 취소라던지 하는 변경이 일어나면 그때 상황에 맞게 업데이트 해주는게 맞는거 아닌가요?? 일반적으로 변경보다는 조회가 빈번하니까 변경되었을때 미리 계산해두고 조회할떄는 가져다 쓰기만 하는게 더 맞지않나 싶어서요=_=
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계에 대해서 질문드립니다.
선생님께서 양방향으로 처리하는 것보다 단방향으로 처리하는 것이 더 좋다고 말씀하셨는데 그렇다면 한가지 예시로 Member와 order의 관계에서 회원으로 로그인해서 주문내역을 확인하고 싶을 경우 양방향의 경우 다이렉트로 Member.getOrders로 처리가 가능하지만 단방향의 경우 em.find(Order.class, member.getId())를 통해 한번더 쿼리문을 날려야 되는데 이게 더 맞는 사용방법이라는 말씀이신가요??? 아직 실무 JPA경험이 없어서 왜 그 부분이 더 좋은지 이해가 가질 않습니다.. 강의에서 말씀하시는 끊어줘야 된다는 부분이 어떠한 이유로 끊어줘야되는지 여쭤봐도될까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 관계에서 '주인이 아닌쪽은 읽기만 가능'의 의미가 궁금합니다.
안녕하세요, 김영한 강사님. 양방향 매핑 관계에서 '주인이 아닌쪽은 읽기만 가능하다' 라고 설명해 주셨는데요, 이 의미가 잘 이해가 가지 않습니다. 저는 이를 이해하기로, Member(하인) - Order(주인) 관계에서 List<Order> orders = member.getOrders(); 로 가져온 order 객체들에 대해 수정이 불가능하다라고 이해를 했는데요, 간단한 실험을 해보니 orders.forEach(order -> { order.setOrderStatus(OrderStatus.CANCEL); entityManager.persist(order); }); 의 방법으로 order들이 update 되는 것을 확인할 수가 있었습니다. 반대로 order.getMember(); 로 가져온 member들에도 수정이 가능했고요. 혹시 제가 잘못 이해하고 있는것일까요? 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
localhost가 다르게 출력될 경우?
이런식으로 host.internal.docker가 출력되는 경우는 무엇일까요..?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy 성능 질문 드립니다.
안녕하세요. 강의를 듣고 사이드 프로젝트를 하면서 `p6spy` 를 잘 활용하고 있는데요. 강의 내용 중에 prod 에서는 성능 관련을 확인 후 사용해야 된다는 내용을 보고 궁금해졌습니다. 처음에는 그냥 `build.gradle` 에서 prod 설정에만 안뜨게 하면 되겠지 (dev, test 에서는 되는 것을 의도) 라고 생각했는데, profile 에 따라 `build.gradle` 이 동적으로 움직이는 건 application.xml 이랑은 다르게 좀 어렵더라구요; 그래서 질문은 2개 입니다. 1. profile 에 따라 `build.gradle` 의 설정 (특히 dependency) 이 동적으로 움직이게 하는 것을 어떻게 하면 좋을까요? 2. `p6spy` 와 같은 외부 라이브러리의 성능 검증은 어떻게 하는 것이 좋을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
JWT 다중 로그인 처리 질문
user-service에서 AuthenticationFilter를 거치기전 기존에 메모리나, DB에 해당 ID에대한 JWT토큰값이 존재할 경우 기존 토큰은 폐기하고 새로운 토큰값을 발급시켜 새로 로그인한 유저에게 할당해주는 방법으로 하면 괜찮을까요 ??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
size 함수 관련
안녕하세요. 영한님. size 함수의 결과값을 확인하고 싶어서 똑같이 입력했는데 for(Integer s : result) 부분에서 s = 0 이 출력되지 않습니다. 아래 코드에서 어느 부분이 잘못됐는지 알려주시면 감사하겠습니다. try{ Member member1 = new Member(); member1.setUsername("관리자1"); em.persist(member1); Member member2 = new Member(); member2.setUsername("관리자2"); em.persist(member2); em.flush(); em.clear(); String query="select size(t.members) from Team t"; List<Integer> result = em.createQuery(query, Integer.class) .getResultList(); for(Integer s : result){ System.out.println("s = " + s); }; tx.commit();}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderController에 대해서 궁금한게 생겼어요
안녕하세요!! 컨트롤러를 보다가 단순 호기심이 생겨서요 MemberController와 ItemController에서는 회원가입을 하거나 상품을 등록할때, MemberForm클래스나 ItemForm클래스를 만들어서 파라미터값으로 넘겨주셨습니다. 그런데 OrderController에서는 주문을 할 때 OrderForm을 만들지 않고, 하나하나 @RequestParam으로 넘겨준 특별한 이유가 궁금해서 질문드렸어요 별다른 이유가 없으면 OrderForm을 만들어서 넘겨도 되는거죠??
-
미해결Spring Boot JWT Tutorial
@EntityGraph(attributePaths = "authorities") 에 관한 질문입니다.
안녕하세요 ㅎㅎ 쿼리가 수행될 때, Lazy조회가 아니라 Eager조회로 authorities정보를 가져오시는 이유가 뭘까용..?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본키 전략 max + 1 문의
안녕하세요 영한님 JPA 책 부터 인프런의 여러 좋은 강의들 항상 잘 듣고 배우고 있습니다. 간혹 기본키를 숫자 형태로 max + 1로 하는 레거시한 프로젝트를 만나는 경우가 있는데요. 이 경우 동시성 이슈 관련하여 JPA에서 어떤 전략을 사용해야하는지 궁금합니다. (Spring Data JPA 사용 중입니다) 구체적인 예시를 들면 * 사용자 - 식단카드라는 두 개의 테이블이 존재합니다. * 식단카드에는 card_key, user_id를 복합키로하며 그 외 카드 식단 정보가 있습니다. * 식단카드 생성시 user_id를 조건으로 검색하여 가장 높은 card_key를 가져와 + 1해서 card_key를 만들어 저장합니다. 이 때 클라이언트 단에서 비동기 처리로 여러 식단카드를 등록하려다보니 먼저 실행된 요청 쓰레드의 트랜잭션이 성공하고, 두번째 실행된 요청 쓰레드가 먼저 실행된 쓰레드랑 같은 최근값을 읽고 + 1해서 커밋하려니 중복된 키 오류가 발생합니다. 제가 시도해본 방법은 여러가지였는데, 모두 잘 안되더라고요. MariaDB innoDB 엔진 사용하고요. 기본적으로 JPQL을 사용하여 max + 1 값을 가져오는 Repository 인터페이스 메서드 선언 시도 해본 방법 1. @Transactional isolation level을 SERIALIZBLE 로 변경 * 해결 되지 않음 2. 비관적 락 @Lock(LockModeType.PESSIMISTIC_WRITE) * 해결 되지 않음 * 구글링 찾아보니 기본키 인덱스 이외의 다른 인덱스가 있을 경우 동작하지 않는다고 하는데, 정확한 공식 문서 내용을 찾아볼 수가 없네요. 3. JPQL NATIVE QUERY 사용하고 FOR UPDATE로 LOCK * 해결 되지 않음 결국 Spring Retry 연결하여 실패시 계속 재시도하여 들어가게끔 처리는 했는데, 어거지로 해결한 느낌이라 계속 속에 남아있네요 ㅜㅜ 트랜잭션이나 LOCK에 대해서 공부해서 적용해봐도 안되는 이유를 모르겠습니다ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강사님 프로그램 시작시 질문있습니다
제가 야생형 코스를 따라가고 있어서 아직까지 이해가 잘 가지 않고 그냥 따라치기 바쁘네요 ㅎㅎ 다름이 아니라 JPA를 사용하면 어플리케이션 실행 할때마다 테이블을 계속해서 만들고 시작하나요 ?? 그리고 제가 디비가 약해서 디비 관계에대해 잘 이해 못하는 부분들이 조금씩 있고 각 어노테이션들의 기능들을 기본편을 보지않고 와서 그런지 모르고 가고 있는데 계속해서 진도 진행해도 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
extends JpaRepository<> vs @Repository 질문
안녕하세요 기본편 강의 잘 들었습니다! 질문이 하나 있는데, DB에 접근하는 클래스를 만들 때 스프링 공식 사이트에서는 extends JpaRepository<> 있고 현재 강의에서는 @Repository로 접근을 하는데 둘의 차이가 있는 것 인가요? 추상적인 질문이었다면 죄송합니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional 어노테이션 질문드립니다
안녕하세요 영한님 Jpa 로 단순 조회기능을 이용하게될때 Service Layer 에서 @Transactional(readOnly=true) 를 메소드에 선언해서 사용했었는데요 테스트하다보니 @Transactional 어노테이션 없이 사용해도 조회도되고 controller 단에서도 영속성컨텍스트가 살아있는걸로 확인이 되었습니다 (osiv 는 켜놓았습니다) findById or findAll 같은 단순 조회기능에서는 @Transactional 은 없어도 되는건가요? spring 에서는 기본적으로 트랜잭션범위와 영속성컨텍스트의 범위가 동일하다고 알고있는데 @Transactional 설정을 안해줘도 조회기능에선 영속성컨텍스트가 유지된다고 보면될까요 ? 아니면 @Transactional(readOnly=true) 는 @Transactional 없이 동작하는것과 어떤 차이가 있는걸까요 ㅠㅠ
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
token_secret 변경후 인증부분에 대하여
안녕하세요. 좋은 강의 정말 감사드립니다. 12:12무렵에 token_secret 변경-> busrefresh 후인증할때 Bearer Token의 token값을 변경하지 않아도... debug시 token_secret이 busrefresh로 변경된 값으로 확인 되지만정상적으로 인증 되는것을 확인했습니다. 로그인시 적용된 token_secret 아래의 값입니다. user_token_native_application_#2 이상해서 아래와 같이 다른 값으로 변경후 user_token_native_application_#4 user_token_native_application_#5 user_token_native_application_#9 busrefresh하고 health_check URL을 확인했지만 마찬가지로 인증이 잘되었습니다. 이상한건 아래와 같이 코드를 바꾸면 user_token_native_application_#10 user_token_native_application_#14 user_token_native_application_#17 401Unauthorized 로 정상적인 결과가 나왔습니다. 제 생각으론 # 뒤의 숫자값보다는 자릿수만 인지한거같습니다. 이런생각으로 아래와 같이 숫자를 영문으로 변경해 시도해봤더니 인증이 되었습니다. user_token_native_application_#z 그리고 또 아래와 같이 영문을 두자리수로 늘려봤더니 user_token_native_application_#za 제 생각처럼 숫자든 영문이든 관계없이 자릿수2개로 인지해 인증이 되지 않았습니다. 이런 제 생각이 맞을까요?엉뚱하지만.. 맞아도 이상하고 안맞아도 이상해서 질문드립니다.