묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa 숙련도 향상 관련
영한님이 조언해주신 것 처럼 Spring data jpa 익히기 전에 JPA 먼저 제대로 숙지하고 넘어가고자 하는데요. 강의에서 빠른 수업 진행을 위해 간략히 구성한것들 full로 구현해보는 것 외에 추가적으로 학습하기 좋은 방법이 잇을까요? 개인적으로 공부하는거라 실무에 적용해 볼수가 없어 질문드립니다. 답변주시면 감사드리겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Enum 에서 코드 사용
강의 잘 듣고 있습니다. 저는 ENUM을 GUEST("USER000"), USER("USER010"), ADMIN("USER020"); 와 같이 사용하고 DB에는 "USER000"과 같은 코드 값을 저장합니다. 혹시 EnumType.STRING에서 저 코드 값을 DB에 넣도록 할 수 있을까요? toString()을 오버라이드 하면 가능 한지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 선생님 V2방식에대한 질문
회원등록 V2 방식을 그대로 사용하고 POSTMAN에서 POST방식으로 BODY안에 CreateMemberRequest 클래스의 필드와 같은값으로 데이터를 전송해봤습니다. 그런데 기본생성자가 없을경우에는 "org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jpashops.ormonetwocombine.dto.RequestItemDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jpashops.ormonetwocombine.dto.RequestItemDto` 포스트맨 에러입니다 이런 에러 구문이 나오더군요, 그런데 기본생성자를 CreateMemberRequest에 추가해주고 다시 Postman으로 전송하더니 잘되더군요, 받아온 JSON 데이터를 파싱하는데 기본생성자가 원래 필수인가요~?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다, 다대다 Entity 설계 관련 질문드립니다.
안녕하세요, 선생님. 강의를 듣고 이제 첫 실전에 jpa를 사용하는데 Entity 설계 과정에 어려움이 있어서 질문드립니다. 다름이 아니라 제가 스프링 시큐리와 같이 회원과 권한의 테이블을 설계하려고 해서 조사를 해보니 https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/User.java https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/Authority.java 와 같은 구조 혹은 @ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles; 다대다 구조를 많이 사용하더라구요.. 위 코드의 User 와 Authority는 일대다 구조인데 강의때 배울때 연관관계 주인 설정이나 fetch 타입 설정이 다르고 일대다는 권장 하지 않으셔서 조금 혼동이 오더라구요.. 지 양하라는 말씀을 그대로 쓰는코드들도 꽤 있더라구요. 그래서 최대한 강의때 배운데로 해보려고 아래 스샷처럼 변경 해보았습니다. 위 ERD 이미지 처럼 Entity를 변경해보았습니다.(테이블명은 작업중이라 안맞습니다.) 로그인 시 User객체를 조회 하여 불러오는데 test 코드에서 UserRepository를 통해서 User를 불러오면 데이터를 잘 조회 합니다. 제가 로그인을 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication메소드를 재구현했는데 리턴하는 부분에서 could not initialize proxy - no Session 에러가발생하네요.. @SneakyThrows@Overridepublic Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response) throws AuthenticationException{ UserLoginDto userLogin = objectMapper.readValue(request.getInputStream(), UserLoginDto.class); String requestURI = request.getRequestURI(); if(userLogin.getRefreshToken() == null) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( userLogin.getUsername(), userLogin.getPassword(), null ); // 에러 발생부분 return authenticationManager.authenticate(token);} 제가 뭘 잘못하고 있는지, 어떤걸 참고해야 하는지 알려주시면 알될까요?? 감사합니다. 좋은 하루되세요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
application.yml이 아닌 application.properties 쓰시는 분은 이거 쓰시면 됩니다!
스프링 생성시 버전이 높아 application.properties로 생성되시는 분은 yml쓰셔도 되고 아님 properties 파일에 밑에 복붙하시면 되세요! # H2 설정spring.datasource.url=jdbc:h2:tcp://localhost/~/jpashopspring.datasource.username=saspring.datasource.password=spring.datasource.driver-class-name=org.h2.Driver# JPA 설정spring.jpa.hibernate.ddl-auto=createspring.jpa.properties.hibernate.format_sql=true# Log 설정logging.level.org.hibernate.SQL=debuglogging.level.org.hibernate.type=trace
-
미해결실전! Querydsl
JPQL Concat 질문
안녕하세요 선생님! 수업 잘 듣고있습니다 : ) ! 질문이 있습니다. concat 문자열 합치기 처리는 JPQL 문에서 처리 하지 않고 entity column 값을 그대로 가져와서 자바에서도 합치는 처리가 가능할 것 같은데 보통은 어떻게 처리하는게 좋을까요? 저는 공부하면서 뭔가 JPA가 객체지향 SQL을 사용하기 때문에 가능한 데이터를 entity 에 맞춰 그대로 값을 가져오고 자바에서 객체지향처럼 조작해서 처리하는게 것이 재사용성이 있어서 좋다고 생각했는데 실무 경험이 많이 없어서 어떤 기준을 잡아야 할지 헷갈리네요!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
id값을 Long 타입으로 지정하는 이유가 따로 있나요??
강의를 보면서 계속 궁금했던 건데 id 값을 int가 아닌 Long 타입으로 하는 이유가 뭔지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Enum 관련 질문드립니다.
아무래도JPA 보다는 DB쪽 질문에 가까운거같은데 이해해주시면 감사합니다. Enum이라는게 결국 어떤 카테고리의 역할을 할때가 많은거같은데요 이런경우 보통 인덱스를 걸어주는게 맞나요? db이론상으론 카디널리티가 낮은경우 인덱스를 걸면 효과가 적다고 해서 좀 혼란스럽더라구요. 그리고 강의중간에 말씀하신걸로 보면 그냥 String 형태로 저장해도 된다고 하고 차이가 적다구 하셨긴했는데 카테고리 역할을 할때 의 컬럼이 조건식도 그렇고 많이 쓰이는거 같아서 String비교보단 int비교가 빠르지 않나? 라는 생각이 좀 들었어서 혹시 int값을 주고 다른테이블로 외래키를 연결해서 id값과 String값을 주고 이어준다던가 이럴 필요는 없다고 생각해도 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
패치조인 사용이유 라고 해야할지 ??
예를들어 N:1 관계에서 Member에 team 필드를 Lazy로 설정한 상태일 경우 만약 비즈니스 적으로 대부분이 Member에 관한것만 조회하고 아주 가끔 Member랑 Team을 같이 조회해야 하는경우가 있다면 이럴때 fetch조인을 쓰면 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터뻥튀기, n+1 질문..
1) N+1 문제는 1의 쿼리를날렷을시 N방의 쿼리가 나가는것이고, 데이터 뻥튀기는 중복값이 나오는 거라고 이해하고있는데요 이둘은 다른 의미라고 봐도되는건가요? 2)N+1 문제에서 맴버와, 팀 LAZY 설정, N:1 관계라고 한다면요~ 초기셋팅 Team teamA = new Team();teamA.setName("teamA");em.persist(teamA);Team teamB = new Team();teamB.setName("teamB");em.persist(teamB);Member member = new Member();member.setName("김A");member.changeTeam(teamA);Member member5 = new Member();member5.setName("홍A");member5.changeTeam(teamA);Member member1 = new Member();member1.setName("정B");member1.changeTeam(teamB);Member member2 = new Member();member2.setName("진B");member2.changeTeam(teamB);em.persist(member);em.persist(member1);em.persist(member2);em.persist(member5); List<Member> resultList = em.createQuery("select m from Member m join m.team", Member.class).getResultList(); for (Member memberOne : resultList) { System.out.println(memberOne.getTeam().getName()); } 맴버에관한 쿼리 1방. 팀에대한 쿼리 두방이 나갈거같습니다.. 이런경우가 N+1 이고 데이터 뻥튀기는 없다. 라고 봐도될까요? 3) 이번엔 2번문제의 반대인데요~ 조건은같구요 List<Team> result = em.createQuery("select t from Team t join t.members", Team.class).getResultList(); for (Team team : result) { System.out.println("team = " + team.getName()); for(Member members : team.getMembers()){ System.out.println("members = " + members.getName()); } } 이런경우는 팀에관한 쿼리 한방, 맴버의 이름 2방이 나가니, N+1 이고 , 데이터 뻥튀기가 발생한다가 맞을까요 몇일째 N+1과 데이터 뻥튀기에대해 강의도 다시듣고 , 찾아보고하지만 머리 뇌리속에 안박히네요..
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V5 에서 질문이있습니다.
여기서 oi.order.id in 을사용하셨는데욤 이곳은 배치사이즈가 안먹히나요?~~ 배치사이즈설정도 in 쿼리로 나가는걸로 이해를해서요~ List<OrderItemQueryDto> orderItems = em.createQuery( "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto " + " ( oi.order.id, i.name, oi.orderPrice, oi.count )" + "from OrderItem oi " + " join oi.item i " + " where oi.order.id in :orderIds ", OrderItemQueryDto.class) .setParameter("orderIds", orderIds) .getResultList();
-
미해결실전! 스프링 데이터 JPA
@CreationTimestamp와 @CreatedDate의 선택
저는 평소에 실무에서 @CreationTimestamp를 썼는데요. 이게 하이버네이트에서 제공하는 건줄도 모르고 그냥 막 사용했는데, 이번에 영한님 강의에서 @CreatedDate를 알게되어 둘을 비교해보니 @CreationTimestamp 는 하이버네이트 제공 @CreatedDate 는 스프링 프레임워크 제공 인 것 같더라고요 @CreationTimestamp는 JPA의 표준이 아니라 하이버네이트에서 제공하는 거라 아무래도 나중에 그럴일은 없겠지만, JPA 구현체를 하이버네이트 말고 딴거로 바꾸면 못쓴다는 단점이 있을 것 같긴 한데, @CreationTimestamp를 쓰면 @EnableJpaAuditing 같은거 안 해줘도 돼서 편하더라고요. 실무에서는 어떤 방식이 더 선호되나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강사님 외람된 질문입니다만 ...
너무 실례되는 질문인걸 알지만 도저히 못찾겠어서 그러는데요 unInjection 옵션을 켜기 전에는 다 코드상에서 jpql을 인식해서 자동완성을 좀 편하게 했는데요 이번에 따라 치다가 unInjection 한 후로 모든 파일에 jpql이 그냥 일반 string으로 인식되더라구요 ㅠㅠ 이거 코드 하나하나 injection 하는거 말고 다 같이 injection 하는거 없을까요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test 코드
OrderService의 order 메소드에 대한 단위 테스트를 작성해보려는 중에 질문이 생겨서 문의드립니다!orderRepository에서 save(order)를 하려면 Order객체를 만들어줘야하는데 Order 객체를 만드는게 Member, Delivery, OrderItem 이게 필요하니깐 테스트 코드에서 일일이 생성해서 만들어준 다음에 when(orderRepository.findOne(orderId)).thenReturn(만든 order객체) 요런식으로 해줘야 할까요?아래는 그냥 제가 끄적여 본건데 단위테스트가 독립적인 테스트라 해서 Mockito를 이용해 짜본건데 맞게 했는지 잘 모르겠습니다... OrderService의 order 메소드에 대한 단위 테스트는 어떤식으로 짜면 좋을지 조언 부탁드립니다...! @Mock private OrderRepository orderRepository; @InjectMocks private OrderService orderService; @Mock private MemberRepository memberRepository; @Mock private ItemRepository itemRepository; @Test public void 상품_주문(){ //given Member member = createMember(); Item item = createBook("시골JPA", 10000, 10); int orderCount = 2; //when when(memberRepository.findOne(member.getId())).thenReturn(member); when(itemRepository.findOne(item.getId())).thenReturn(item); doNothing().when(orderRepository).save(any(Order.class)); Long orderId = orderService.order(member.getId(), item.getId(), orderCount); //then //when(orderRepository.findOne(orderId)).thenReturn() Order getOrder = orderRepository.findOne(orderId); assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER, getOrder.getStatus()); assertEquals("주문한 상품 종류 수가 정확해야 한다.",1, getOrder.getOrderItems().size()); assertEquals("주문 가격은 가격 * 수량이다.", 10000 * 2, getOrder.getTotalPrice()); assertEquals("주문 수량만큼 재고가 줄어야 한다.",8, item.getStockQuantity()); }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
필드에 있는 컬렉션을 초기화 시키는 이유가 뭔가요?
List<Order> orders = new ArrayList<>(); 이렇게 컬렉션만 초기화 해주는 이유가 궁금합니다. 단순히 NPE 방지를 위해서인가요? 그렇다면 왜 래퍼 클래스는 초기화 하지 않나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 업로드 일정 질문있습니다.
영한님 강의 매우 잘 듣고 있습니다. 9월까지 모든 강의를 다 들을 것 같은데 혹시 "스프링 DB 접근 기술"과 "스프링 부트"는 언제 쯤 나오나요? 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
이 강의를 다 들은 후 어떤 로드맵을 따라갈까요?
이 강의를 들으며 스프링을 처음 공부해봤습니다. 이 강의를 다 들은 후 [스프링 완전 정복]로드맵을 들을지 [스프링부트와 JPA 완전 정복]을 들을지 고민이 되는데, 추천해주실 수 있나요? 현재 저의 상황을 말씀드리자면 이 강의를 듣기 전 장고로 간단하게 개인 프로젝트를 해본 적이 있습니다. 규모는 크지 않고 간단한 CRUD 정도 해봤습니다. 현재 앱개발 외주를 받았는데, UI를 만드는 사람은 따로 있고 저는 백엔드 서버만 개발하면 됩니다. (외주 개발 기간은 2달 +@ 입니다. 기능은 로그인, 회원가입, 결제.. 등이 있고 택배 어플과 유사한 기능을 하는 앱입니다) 이런 상황을 전체적으로 고려했을 때 어떤 로드맵이 더 좋을까요? 참고로 김영한님의 모든 강의는 이미 구매했습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@EmbeddedId 관련 질문
안녕하세요 선생님, DDD 공부하면서 적용해보던 중 JPA 관련 궁금한 점이 생겨 질문드립니다. 애그리거트 루트에 해당하는 엔티티의 @Id 필드를 아래와 같이 작성하는 것보다, Member 엔티티 @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "members") @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; private String password; @Builder public Member(String email, String password) { this.email = email; this.password = password; } } 아래와 같이 값 타입을 만들어 사용하는 것이 의미상 명확하고, 다른 애그리거트에서 해당 애그리거트 루트의 Id를 참조할 때도 직관적이겠다 생각했습니다. MemberId 값 타입 @EqualsAndHashCode @NoArgsConstructor(access = AccessLevel.PROTECTED) @Embeddable public class MemberId implements Serializable { @Column(name = "member_id") private Long id; public MemberId(Long id) { this.id = id; } } Member 엔티티 @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "members") @Entity public class Member { @EmbeddedId @GeneratedValue(strategy = GenerationType.IDENTITY) private MemberId memberId; private String email; private String password; @Builder public Member(String email, String password) { this.email = email; this.password = password; } } 그런데 문제는 @Id에 해당하는 필드에 값 타입을 사용하면 @GeneratedValue가 정상적으로 동작하지 않았습니다. 찾아보니, @Id에 해당하는 필드에 값 타입이 쓰이면 복합키로 인식해 @GeneratedValue를 무시한다는 것을 알았습니다. 제가 여쭙고 싶은 질문은 다음과 같습니다. 1) 위와 같이 애그리거트 루트의 Id를 값 타입으로 만들어 사용할 때, auto_increment 기능 또한 사용할 수 있는 방법이 있는지 궁금합니다. 2) 선생님께서는 위와 같이 값 타입을 생성해 애그리거트 루트의 Id로 사용하는 것에 대해서 어떻게 생각하시는 지 궁금합니다. 항상 좋은 강의 감사합니다.
-
미해결자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!
이해가 안가는 부분이 있습니다.. 선생님들.. 도와주세요..!!
지금 배우고있는 배열 관련해서 입니다. 영상에서는 아직 Scanner에 관해서는 정확히 알려주지 않았지만 너무 궁금하고, 왜 마지막에 scanner. close(); 를 하는지도 잘 모르겠습니다. 그리고 Scanner scanner = new Scanner(System.in); 이 코드에 적혀있던데, Scanner(System.in) 인지도 잘 모르겠어요 ㅠㅠ 그리고 System.out.printf("%s의 점수를 입력하시오 : " ,name[0]); score[0] = scanner.nextInt();을 사용하던데 nextInt(); 이 부분을 왜 사용하고, 무슨 의미인지 이해가 안갑니다... 정말정말 마지막으로 ㅠㅠ 마지막 출력할 때 System.out.printf("%s 점수 : \t%.2f\n", name[0], (double) score[0]); 이 부분에서 \t%.2f\n 에서 \t은 칸을 띄어 주는거는 알겠고, %.2f 이 부분은 소수점을 두자리까지 보여주겠다는걸로 추측중이긴한데, 아직 잘 모르겠어서... 헷갈립니다..ㅜㅠ \n 이 부분은 개행(?) 으로 알고있는데 정확히 찾아봐도 개행의 뜻을 잘 모르겠고, 개행이란것을 어떨 때 사용하는지도 잘 모르겠습니다 ㅜㅠ printf 일때는 무조건 사용하는건가요?? 그리고 ㅠㅠ system.out.printf("--------------- 평 점" : \t%.2f" , ave); 마지막 이부분에서 평점앞에 ------ 이것들은 왜 붙여주는건가요?? 이제 막 입문이라서 정말 아무것도 몰라서... 궁금한것이 굉장히 많아요..ㅜㅜ 많은 개발자 형누님들... 불쌍한 어린양 한번만 구해주세요.. 부탁드립니다..
-
해결됨Java 디자인 패턴
Notion 엑세스 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! PDF 파일에 Notion관련 하이퍼링크가 있어서 들어갔는데, access 권한이 없어서 글을 읽을 수가 없습니다. 혹시 Notion의 Share 기능을 통해 웹 공유 체크하지 않으셨는지 궁금합니다.