25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 QueryDSL이 안됩니다..
안녕하세요. 강사님 https://www.inflearn.com/questions/149157 여기 글이랑 같은 오류인데 강사님이 알려주신 링크 들어가니까 권한이 없다고 나오는데.. 방법을 모르겠습니다. ㅜ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤러와 서비스의 역할이 궁굼합니다
안녕하세요 지난번의 설명은 많은 도움이 됐습니다 여전히 이해가 가지 않는 부분이있습니다 컨트롤러가 요청을 받는 엔드포인트라면 서비스는 운영로직부분이라고 하셨는데 컨트롤러로 아이디와 비밀번호를 받는 로그인 컨트롤러가 있다고하면 컨트롤러에서 서비스를 호출해 아이디와 비밀번호의 유효성을 검증하고 리턴하는 행위가 일어나는것인가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션에 대한 fetch join은 1개만 사용해야 한다에 대한 질문
안녕하세요 영한님. 간단한 질문을 드리고 싶어서 글 남기게 되었습니다. 강의 마지막에 "컬렉션(일대다 관계)에 대한 fetch join은 1개만 사용해야 한다. 2개 이상 붙이면 일대 다대 다 형태가 되어버리기 때문에... " 라고 설명해주셨습니다. 여기서 2개 이상 사용하는 케이스는 아래 두 케이스를 모두 포함하는 것인지 궁금합니다 :) - Order 클래스 내부에 일대다 관계에 대한 필드가 2개인 경우 - Order 클래스 내부에 일대다 관계에 대한 필드가 1개고, 그 필드의 객체 내부에 일대다 관계에 있는 필드가 존재하는 경우 문득 생긴 고민이라 적절한 예시가 생각나지 않네요ㅠㅠ 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 질문 드립니다. org.gradle.api.GradleScriptException: A problem occurred evaluating root project 에러가 발생합니다..
마지막 강의에서 queryDsl 설정을 적용했을때 .. 이런 에러가 발생합니다.. 제가 git에서 프로젝트를 올려놓고 프로젝트를 여러환경에서 받아서 그런게 아닐까 생각은 하는데 .. 어떻게 해결을 하면 좋을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님. 강의에서 벗어나지만 질문이 있어 드립니다.
안녕하세요 강사님. 강의를 다 듣고 JPA 책으로 한 번 더 개념을 정리하기 위해 읽고 있는 학생입니다. 바쁘실텐데 수업과 관련없는 질문을 드려 죄송합니다. 다대다 양방향 관계에서 @ManyToMany를 쓰지 않고 일대다, 다대일로 나눠서 매핑해주는 이유가 잘 이해가 되지 않습니다. 데이터베이스에서 다대다 매핑이 실제로는 불가능해서 연결 테이블을 만들어서 다대다 관계를 일대다와 다대일 관계로 나눠준다는 것은 이해하였습니다. 하지만 JPA 책에서, 연결 테이블에 외래 키 이외에 다른 컬럼을 추가하였을 때, 매핑하는 엔티티들에서는 추가한 컬럼들을 매핑할 수 없기 때문에 @ManyToMany를 사용할 수 없다 라고 나와있는데 무슨 의미인지 잘 모르겠습니다. (책에 소개된 예시는 주문 엔티티와 상품 엔티티를 연결해주는 주문상품 엔티티를 만들고, 주문상품 엔티티에 외래 키 외에 주문 수량과 주문 날짜를 추가할 경우 @ManyToMany 를 사용하지 못한다고 되어 있는데 그 이유를 모르겠습니다.) 책을 따라 읽으면서 연결 테이블에 외래 키만 갖고 있으면 다른 컬럼들이 추가되어도 대상 엔티티들과 매핑이 된다고 생각했는데, 그렇지 않다는 말을 보고 고민해봤지만 그 이유를 모르겠어서 질문을 드립니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 선생님.
안녕하세요 선생님. 한가지 여쭤보고 싶은 점이 있어서 글을 남깁니다. 수업과 조금 별개일 수 있지만 ElementCollection도 따로 쿼리를 발생시키지 않고 한 번에 끌어오는 마땅한 방법이 있을지 여쭤보고 싶습니다. 선생님 강의를 듣고 공부한 덕분에 요즘 더 많은 것들을 배우고 적용시킬 수 있었습니다. 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA DTO 직접조회 질문 드립니다.
안녕하세요 강사님. 강의 복습 중에 질문이 생겨서 문의 드립니다 JPA 에서 DTO 직접조회를 하는데 (일대다 조회) 일반적으로 엔티티를 DTO 로 변환해서 조회하는 방법보다 더 불편하고 유지보수할때 복잡해 보이는데, 실제 운영에서도 DTO를 직접조회해서 사용을 많이 할까요 ??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
몇가지 개념이 이해가 가지않습니다
전체적인 구조를보면 Entity -> Repository -> Service -> Controller 로 이루어져있는데 1. 각각의 명세된 역할이 궁굼합니다 엔티티는 데이터베이스와의 매핑 Repository는 DB에 접근하는것 Service는 컨트롤러를 통해 받은 요청을 정제?하는것 컨트롤러는 RESTAPI와같은 통신부라고 이해를 했습니다 그런데 강의내용에서 엔티티에서도 생성 조회 주문취소 로직등이 존재했습니다 정확하게 Entity Repository Service Controller 4개의 역할범위에대해서 검색을 해보아도 자료가 잘 나오지 않고 강사님의 강의에서도 어느정도 중복영역이 있다고 이해가 되는데 혹시 저 4개의 역할들을 간략하게나마 설명해주실수 있나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
toMany 관계에서 where 절
안녕하세요 강사님 jpa 공부중에 궁금한게 있어 질문드립니다. 먼저 OneToMany 양방향 관계인 Team과 Member가 있습니다. Team을 조회하면서 그중 나이가 10살 이상인 Member만 조회하도록 다음과 같이 코드를 작성했습니다 @Testvoid test2() { QTeam team = QTeam.team; QMember member = QMember.member; JPAQueryFactory query = new JPAQueryFactory(em); List<Team> result = query.selectFrom(team) .join(team.members, member) .where(member.age.eq(10)) .fetch(); result.forEach(t -> { t.getMembers().forEach(m -> { Assertions.assertThat(m.getAge()).isEqualTo(10); }); });} 테스트 코드는 실패를 했습니다. 원인은 where절이 Team을 조회할때만 적용되었고 LazyLoading으로 Member를 가져올 때는 적용되지 않기 때문입니다. 그래서 이를 해결하기 위해 Member에 대한 쿼리를 추가적으로 작성하여 조회를 했습니다. @Testvoid test3() { QTeam team = QTeam.team; QMember member = QMember.member; JPAQueryFactory query = new JPAQueryFactory(em); List<Team> result = query.selectFrom(team) .join(team.members, member) .where(member.age.eq(10)) .fetch(); List<Long> teamIds = result.stream().map(Team::getId).collect(Collectors.toList()); List<Member> members = query.selectFrom(member) .where( member.team.id.in(teamIds), member.age.eq(10) ) .fetch(); Map<Long, List<Member>> memberMap = members.stream().collect(Collectors.groupingBy(m -> m.getTeam().getId())); result.forEach(t -> t.setMembers(memberMap.get(t.getId()))); result.forEach(t -> { t.getMembers().forEach(m -> { Assertions.assertThat(m.getAge()).isEqualTo(10); }); });} 그리고 이 테스트는 통과를 했고 출력값도 원하는 값을 얻게 되었습니다. 여기서 궁금증이 하나 생겼습니다. fetchjoin의 대상에는 where절을 걸면 안된다 -> fetchjoin의 경우 연관된 모든 엔티티가 존재할것으로 가정하고 사용해야 하기에 객체와 DB의 일관성이 깨지기 때문이다. 를 검색해서 알게 되었는데 제 코드의 경우 fetchjoin을 사용하지 않았습니다. 과정이 어쨋든간에 엔티티 조회를 했고 조회한 엔티티가 온전한 데이터를 모두 갖고 있는게 아닌 필터링된 데이터만 갖고 있기에 위의 fetchjoin처럼 데이터의 일관성이 깨져있는것으로 보이는데 제가 이해한것이 맞는지 궁금합니다. 또한 다음과 같이 엔티티에 where 절을 걸어서 조회하는 케이스도 데이터의 일관성이 깨진다고 볼 수 있는지 궁급합니다. @Entity@Getter@Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"})@Where(clause = "age = 10")public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username) { this(username, 0); } public Member(String username, int age) { this(username, age, null); } public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); }}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
스프링부트 쿼리로그가 자꾸 일직선으로 나오네요
자꾸 이런식으로 나오는데 application.yml은 강의 내용그대로 띄어쓰기 잘 적용했습니다.. 어떻게하면 예쁘게 쿼리를 볼 수있을까요..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
복습하는데 질문 드립니다!
강의 잘 듣고있습니다! 다름이아니라, api 만드실때 내부 클래스로 request, reponse 를 만드셔서 사용하시는데, 실제 사이트에서 개발할때도 내부클래스로 만들어서 사용하는게 맞을까요 ? ? ?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
postman에서 400 에러가 발생합니다.
안녕하세요 강사님. 처음 "name": "hello" 를 등록했을때는 잘되었는데 그 다음에 다시 하니까 400 에러가 발생하는데 이유를 모르겠습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
한 애플리케이션에서 OSIV를 어떻게 나누어 관리하나요?!?!
마지막 참고에서는 트래픽이 많은 API는 OSIV를 끄고, 많은 트래픽이 없어 커넥션을 유지해도 되는 상태인 ADMIN같은 경우는 OSIV를 켜두는 것이 좋다고 하셨습니다!!! 여기서 궁금한 점이 spring.jpa.open-in-view는 글로벌 설정인데 한 애플리케이션에서는 화면 의존적인 서비스가 있을 수도 있고 아닐 수도 있다고 생각합니다. (여러 서비스가 있을 수도 있다고 생각합니다.) 그렇다면 개별적으로 osiv를 설정하는 방법이 있는건가요? (항상 좋은 강의 감사합니다.)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
TDD 관련 질문
안녕하세요 영한님 드디어 야생형 코스가 끝났습니다! 스프링 MVC도 이제 곧 구매 대기 중입니다ㅎㅎ 다름이 아니라 TDD 관련 질문입니다. 질문을 어디다 해야될지 모르겠어서 여기 다 질문합니다.. 1. 보통 Spring에서 각 계층별로 TDD를 진행하나요? 예를 들어, entity -> repository -> service -> controller 순으로 수업을 진행하셨는데 실무에서는 entity 개발 후에 entity 로직에 대한 tdd, respository tdd, service tdd, controller tdd 이런 식으로 다하나요? 2. 각 계층별로 단위 테스트와 통합 테스트를 전부 다 하는 건가요? 현재 프로젝트를 진행하는 데 계층별로 단위 테스트와 통합 테스트를 다 해야되는 건지 궁금했는데 구글링해도 자료가 잘 없네요ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join fetch 와 그냥 join 이 동일한 결과를 가지고 오나요?
안녕하세요. 강의 재밌게 잘 보고 있습니다. jpql 예제에서 V3 에는 join fetch 를 사용하고, V4 에서는 join 만 사용하셨는데 동일한 inner join 쿼리가 생성된 것 같습니다. 두 개의 사용 유형이 같은 방식으로 동작하는 것인지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
궁금한것이 있습니다!!!
강의 15:42분의 Json Response 결과 중, 연관관계가 설정된 필드값들이 null 값으로 설정되어 명시된 것을 확인할 수 있는데요! @BeanHibernate5Module hibernate5Module() { return new Hibernate5Module();} 위 코드의 설명이 pdf 13/43에 "기본적으로 초기화 된 프록시 객체만 노출, 초기화 되지 않은 프록시 객체는 노출 안함" 되어있습니다. 이는 null 값으로 나온 값들은 null로 초기화 되어 노출된 것인데, 어느 부분에서 null로 초기화가 된 것인지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA Entity Getter 문제 질문드립니다.
안녕하세요 영한님!! 오늘 공부를 하다 느낀점인데 엔티티에 @Getter 롬복을 실무에서도 사용하는지 궁금합니다. 왜냐하면, Order와 OrderItem의 관계에서 Order가 List<OrderItem> items를 OneToMany로 가지고 있는데 Order order = orderRepository.findById(1L).get();List<OrderItem> items = order.getItems();OrderItem orderItem = new OrderItem("test", 1, 1);items.add(orderItem); 위와 같은 코드에서 jpa의 변경감지와 Cascade 옵션으로 인해서 OrderItem Insert쿼리가 나가는걸 이해했고 테스트코드를 통해 확인했습니다. 이렇게 되면 의도한바(order.addOrderItem()) 등의 메소드를 사용하지 않고도 추가되는 문제점이 발생할 것 같은데, @Getter를 지양해야 할까요? 그러기엔 @Getter의 편의성이 너무 좋은 것 같아 실무에서는 어떻게 사용되는지 궁금합니다. 추가적으로, getter가 없으면 lazy loading이 불가능하다고 생각해서 대안으로 OrderEntity에 getter를 재정의 해주었습니다. public List<OrderItem> getItems() { return new ArrayList<>(this.items);} 이렇게 되면 getItems를 통해 가져온 뒤 add를 통해서는 insert쿼리가 나가지 않게는 되었습니다. 그런데 만약 이 상황에서 OrderItem을 접근해서 변경하게 되면 OrderItem은 영속되어 있기 때문에 변경이 됩니다. 이렇게 해도 괜찮은걸까요??! 항상 질좋은 강의 감사합니다!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Response 관련 질문있습니다!
안녕하세요 영한님! 보통 실무에서는 ResponseEntity를 많이 쓰나요? 그럼 ResponseEntity에 제네릭을 쓰는 데 구성 요소를 회사마다 다르지만 보통 원칙적으로 어떻게 구성하나요? 1. HTTP status code 2. message 3. data (responsedto) 이런 식으로 보통 구성되어 있는 것으로 아는데 HTTP 상태 코드와 메시지만으로 반환할 때도 있나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO를 만드는 레이어에 관한 질문
안녕하세요! - 서비스에서 DTO를 만들어서 컨트롤러에게 리턴하는 방식 - 서비스에서는 엔티티를 리턴하고 컨트롤러에서 최종적으로 응답을 내보낼 때 DTO로 감싸서 내보내는 방식 두가지의 방법중에서 어떠한것이 더 좋은 선택일까 고민하고 있습니다. 인터넷을 찾아봐도 많은 논쟁들이 있었지만 무엇이 더 나은 방법이라고 확실하게 답변해주는 건 없는 것 같아요. 개인적으로 서비스에서 DTO를 반환하는게 핵심 비즈니스 로직을 감출 수 있고 의존성을 낮출 수 있다고 생각합니다. 그런데 여기서 문제점이 생기는데, 예를 들어 UserService에 아래와 같은 메소드 2개가 있다고 가정할게요. - findByUserId(Long id) - 내부에서 repo호출하여 유저 엔티티를 가져온 후 DTO로 반환 - updateUser(Long id, ...) `updateUser()`에서는 `findByUserId()`를 호출하여 유저를 가져오고 특정 로직에 따라 업데이트하는 구문을 수행하는 목적입니다. 그런데 `findByUserId()`에서 엔티티를 반환했기때문에 엔티티를 가져오기 위해 다시 한번 repo를 호출하여 실제 엔티티를 가져온 후 정보를 변경하는 로직을 수행해야합니다. 따라서 추가적인 쿼리가 발생하는 문제가 생깁니다. 사실 위 예제는 조금 극단적인 예제이긴 합니다만, 실무에서 개발하다보니 서비스에서 서비스를 호출하는 경우가 빈번하게 발생하더라구요. 하지만 엔티티 자체를 컨트롤러까지 노출하는건 뭔가 꺼려집니다. 질문을 요약하자면, DTO를 서비스에서 리턴하는 방식과 서비스는 엔티티를 리턴하고 컨트롤러에서 DTO로 조합하여 최종 응답을 내보내는 방식 중 어떠한 것이 더 좋다고 생각하시는지 알고 싶습니다. (또는 실무에서 자주 사용하는 방식) 감사합니다 :)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
스프링 부트로 이미지 저장 관련 질문
안녕하세요 영한님의 강의로 공부하며 간단한 예제를 만들어 보던 도중 궁금한 점이 생겼습니다. REST한 방식으로 클라이언트로 부터 이미지 데이터를 json 형식으로 받아와서 DB에 저장하려고 하는데, 구글링을 해보니 binary형식인 이미지 데이터를 base64로 인코딩하여 데이터를 넘겨주면 된다고 합니다. 그럼 이 때, 인코딩이나 디코딩은 프론트 쪽에서 수행하고 백엔드 쪽에서는 추가적인 작업 없이 해당 데이터를 받아서 DB에 저장하고 꺼내주는 식으로 로직을 짜면 되는건지 궁금합니다. 추가적으로, 현업에서는 이미지나 파일 데이터를 어떤 식으로 핸들링 하시는지도 궁금합니다. 긴 질문 읽어주셔서 감사합니다.