묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨
쿼리DSL 연관관계 JOIN하여 DTO로 조회하기
안녕하세요 영한님의 강의를 맹신하는 대학생 개발자입니다!다름이 아니라 플랫폼을 개발하고 있는데 연관관계가 포함된 People과 PeopleProfile 사이에서 join을 통해 값을 가져오려고 합니다. PeopleEntity@Getter @Entity @Table(name = "people") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class People extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "people_id") private Long peopleId; @Column(name = "nickname") private String nickname; @Column(name = "email") private String email; @Column(name = "phone_number") private String phoneNumber; @Enumerated(EnumType.STRING) @Column(name = "people_type") private PeopleType peopleType; @Column(name = "profile_image_uri") private String profileImageUri; @Column(name = "account_number") private String accountNumber; @OneToOne(cascade = CascadeType.REMOVE) private Member member; @OneToOne(mappedBy = "people") private PeopleProfile peopleProfile; ... } PeopleProfile@Entity @Getter @Table(name = "people_profile") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PeopleProfile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "people_profile_id") private Long peopleProfileId; @Column(name = "introduction") private String introduction; @Column(name = "activity_area") private String activityArea; @Column(name = "education") private String education; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "people_id") private People people; @ElementCollection @CollectionTable(name = "people_hashtags", joinColumns = @JoinColumn(name = "people_profile_id")) @Column(name = "hashtags_id") private List<Hashtag> hashtags = new ArrayList<>(); ... } Hashtag@Embeddable @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Hashtag { @Column(name = "hashtag") private String value; private Hashtag(String value) { this.value = validate(value); } private String validate(String value) { return value; } public static Hashtag from(String value) { return new Hashtag(value); } }hashtag는 값 타입으로 구현했습니다. PeopleDTO@Getter public class CardPeopleResponse { @NotNull private Long peopleId; @NotNull private String nickname; @NotNull private String peopleType; @NotNull private String profileImageUri; @Valid private CardPeopleProfileResponse profile; @QueryProjection public CardPeopleResponse(final Long peopleId, final String nickname, final People Type peopleType, final String profileImageUri, @Valid CardPeopleProfileResponse profile) { this.peopleId = peopleId; this.nickname = nickname; this.peopleType = peopleType.name(); this.profileImageUri = profileImageUri; this.profile = profile; } }PeopleProfileDTO@Getter public class CardPeopleProfileResponse { @NotNull private final String activityArea; @NotNull private final List<String> hashtags; @NotNull private final Integer completedProjectsCount; @NotNull private final Integer interestsCount; @QueryProjection public CardPeopleProfileResponse(final String activityArea, final List<Hashtag> hashtags, final Integer completedProjectsCount, final Integer interestsCount) { this.activityArea = activityArea; this.hashtags = hashtags.stream().map(Hashtag::getValue).toList(); this.completedProjectsCount = completedProjectsCount; this.interestsCount = interestsCount; } } 쿼리DSLprivate List<CardPeopleResponse> getCardPeopleContent(Pageable pageable) { return queryFactory .select(new QCardPeopleResponse( people.peopleId, people.nickname, people.peopleType, people.profileImageUri, new QCardPeopleProfileResponse( peopleProfile.activityArea, peopleProfile.hashtags, Expressions.constant(0), Expressions.constant(0) ) )) .from(people) .join(people.peopleProfile, peopleProfile) .orderBy(getPeopleOrderSpecifiers(pageable.getSort())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); } completedProjectsCount와 interestsCount는 추후 개발 예정이므로 Expressions.constant(0)으로 대체 해뒀습니다. 위와 같이 서버를 구현하였을때, 서버 구동은 문제 없이 됩니다. 문제점2024-02-22T16:44:50.163+09:00 DEBUG 3487851 --- [io-52003-exec-1] org.hibernate.SQL : select p1_0.people_id, p1_0.nickname, p1_0.people_type, p1_0.profile_image_uri, p2_0.activity_area, h1_0.hashtag from people p1_0 join people_profile p2_0 on p1_0.people_id=p2_0.people_id join people_hashtags h1_0 on p2_0.people_profile_id=h1_0.people_profile_id order by p1_0.people_id desc offset ? rows fetch first ? rows only 2024-02-22T16:44:50.274+09:00 ERROR 3487851 --- [io-52003-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.InvalidDataAccessApiUsageException: argument type mismatch] with root cause java.lang.IllegalArgumentException: argument type mismatch at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na] at com.querydsl.core.types.ConstructorExpression.newInstance(ConstructorExpression.java:144) ~[querydsl-core-5.0.0.jar!/:na] at com.querydsl.core.types.FactoryExpressionUtils.compress(FactoryExpressionUtils.java:155) ~[querydsl-core-5.0.0.jar!/:na] at com.querydsl.core.types.FactoryExpressionUtils.access$100(FactoryExpressionUtils.java:28) ~[querydsl-core-5.0.0.jar!/:na] at com.querydsl.core.types.FactoryExpressionUtils$FactoryExpressionAdapter.newInstance(FactoryExpressionUtils.java:62) ~[querydsl-core-5.0.0.jar!/:na] at com.querydsl.core.support.ConstantHidingExpression.newInstance(ConstantHidingExpression.java:87) ~[querydsl-core-5.0.0.jar!/:na] ...다음과 같은 argument type mismatch에러가 발생합니다. DTO에서 값을 받아와서 생성자에서 데이터 타입을 변경하면 문제가 되는걸까요? 이러한 경우에는 보통 어떻게 조회하는지 궁금합니다!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
공통 Dto validation 방법 질문입니다!!
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)질문 잘하기 메뉴얼을 읽어보셨나요? (예)==================================================================안녕하세요. 선생님 덕분에 많은 것을 배우고 있는 취준생입니다.현재 상황회원 정보에 대한 공통 DTO 생성 (회원 엔티티에 노출 가능한 모든 필드를 담았습니다.) 목표공통 DTO에 validation 적용 문제 상황공통 DTO를 사용하니 컨트롤러, 서비스 로직에 따라 조건이 달라 Bean validation 적용에 어려움을 겪고 있습니다.ex) 서비스 메소드 마다 member_id가 필요한 경우가 있고, 없는 경우가 있습니다. 생각해본 해결 방법Bean validation(어노테이션)을 통해 최소한에 검증만 한 후 개별 로직안에서 추가 validation을 진행한다.가장 간단하나 로직이 지저분해질 것 같습니다. 공통 DTO를 validation을 따라 분리한다.DTO 분리 기준이 validation이라는 점이 타당하지 않은 것 같습니다. DTO 생성을 별도의 팩토리로 분리하여 팩토리 내에서 validation을 진행한다.DTO 생성과 검증에 대한 로직을 숨길 수 있는 장점이 있지만 DTO 수가 늘어날수록 팩토리 클래스도 많아져서 복잡도가 올라 갈 것 같습니다. DTO 내에 별도의 검증 메소드를 만들어 생성될 때 validation을 진행한다. Bean validation group을 사용한다. 질문JPA 강의에서 공통 DTO를 사용 후 예외 케이스만 분리하신다는 답변을 봤습니다. 공통 DTO에 경우 validation을 주로 어떻게 해결하시는지 궁금합니다!!공통 DTO에 회원 엔티티에 대부분 필드를 담았는데, 위에 말씀하신 공통 DTO를 잘못 이해하여 범위를 너무 크게 잡아 생긴 문제인지 혹은 Bean validation으로 풀어내려는 강박인지(?) 궁금합니다!!읽어주셔서 감사합니다!!
-
미해결실전! Querydsl
Projections.fields()와 Projections.bean() 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]>> 로컬 환경스프링부트 3.1.2hibernate-core 6.2.6안녕하세요!Projections.bean()은 setter를 이용해서 인스턴스를 만든다고 하셨는데, getter/setter를 전부 제거해도 테스트를 통과하고 인스턴스도 잘 초기화가 되어버렸습니다.좀 이상하기도 하고 bean()와 fields()가 동작 방식이 거의 같은 것 같아 확인해보니 new QBean<T>를 할 떄 fields()에는 fieldAccess 파라미터에 true를 인수로 넣는 차이밖에 없더라고요.public static <T> QBean<T> fields(Class<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type, true, exprs); }라이브러리 코드를 보면fieldAccess가 true면 this.fields에 값을 바인딩하고 this.setters는 emptyList로 초기화하고 fieldAccess가 false일 경우 this.fields를 emptyList로 초기화하고 this.setters에 값을 바인딩하는데요.if (fieldAccess) { this.fields = initFields(bindings); this.setters = Collections.emptyList(); } else { this.fields = Collections.emptyList(); this.setters = initMethods(bindings); }실무에서 활용할 때 이 두 함수 관련해서 주의점이 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DTO 사용 문의
안녕하세요 좋은 강의 감사드립니다. 한가지 여쭤볼게 있어서요강의에서는 DTO를 따로 정의안하고 엔티티로 모두 사용한것으로 보여지는데 실무에서도 DTO와 엔티티를 구분안하고 해도 되는 걸까요?찾아보니 엔티티는 setter를 사용안하는것을 권장하고DTO의 setter를 구현해서 대부분 기능적 처리하고 마지막으로 DB저장할때 엔티티를 사용하는 것 같아서요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요. Entity 필드 구성과 응답 DTO에 대해 질문 드립니다.
안녕하세요 김영한 강사님. 항상 좋은 강의와 친절한 답변 너무 감사드립니다.강의를 듣고 게시판 구현 프로젝트 진행 중 두 가지 고민이 생겨 질문 드립니다.첫 번째 질문은전체 게시글 리스트를 반환할 때, 게시글 리스트에 댓글 개수와 태그 이름 등을 함께 API 응답으로 반환해야 하는 상황입니다. 이때,엔티티의 필드에 comment_count, tag_name 형식으로 적어줘야 할 지, 아니면comment와 tag 테이블에 쿼리를 날려 가져와서 응답 DTO 필드에 적어줘야 할 지 고민하고 있는 상황입니다.1번 방식으로 하면 무언가 불필요한 필드가 테이블에 포함되는 것 같고, 2번 방식은 추가 쿼리가 많이 나갈 것 같아 망설여집니다.보통 이런 경우 어떤 방식으로 처리는 게 좋은 지 궁금합니다!두 번째 질문은응답 DTO에 클라이언트가 필요로 하지 않는 데이터가 포함되어 있어도 되는지 궁금합니다.예를 들어, title과 content를 필드로 가지는 DTO를, title만을 필요로 하는 요청에 반환해도 괜찮은 지, 아니면 응답 마다 DTO 각각 따로 생성해야 하는지 궁금합니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 관련해서 질문드립니다!
안녕하세요! 로드맵 따라서 좋은 강의 잘 듣고 있습니다. 실제 프로젝트를 진행하면서도 들었던 의문인데 생성, 수정과 같은 역할이 다른 Dto이지만 동일한 값을 가져가는 Dto가 많이 생성되는 것을 느끼게 되었습니다. 실제 실무에서는 이런 경우 Dto를 어떻게 처리하시는지 궁금합니다! 동일하게 쓰이는 값들을 한 곳으로 모아 상속을 통해 하위 Dto를 만드는 방법도 생각해보았는데 이런 방법은 어떤지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto join 과 일반 fetch join 차이점에 대해 질문 있습니다
em.createQuery( "select new jpadook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" + " from Order o" + " join o.member m" + " join o.delivery d" , OrderSimpleQueryDto.class) .getResultList(); createQuery문은 결국 fetch조인이 내부적으로 된다고 생각해도 됩니까?
-
미해결실전! Querydsl
entity와 DTO의 join
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님 jpa 로드맵을 수강하고 사이드프로젝트를 진행중인데요. 제목과 같이 entity 와 dto를 join할수 있는지 궁금합니다. 구체적으로 설명해보자면 우선 1. open api를 통해서 List<T> 를 DTO로 받아서(ex, 상품 list) 사용자가 상품을 좋아요 누른 데이터를 DB에 저장해두었습니다.(member idx 와 상품 idx 저장) open api 에서 받은 데이터는 따로 DB에 저장하지 않고 호출시마다 DTO로 응답하는데요. 2. 여기서 당연하게도 open api에서 받은 list에는 사용자의 좋아요가 담겨 있지 않기때문에 DB에서 사용자가 좋아요 누른 상품 list를 조회 후에 open api 에서 받은 list 를 돌며 좋아요 데이터를 추가해주고 있습니다. 혹시 2번처럼 진행하지않고 DB에서 사용자 좋아요 누른 상품(entity)을 open api 에서 받은 데이터(DTO)와 join 하는 방법은 없을까요? 설명이 부족하다면 말씀 부탁드립니다 ! 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤러 파라미터와 DTO에 대한 질문입니다.
[질문 내용]안녕하세요. 컨트롤러 파라미터에 대해서 질문이 있습니다. 보통 컨트롤러에서 @RequestBody로 DTO를 받는데요. 개인 프로젝트를 진행하면서 ,DTO 클래스를 계속 생성하게 되면 DTO파일도 많아지는 경향이 있다고 느꼈습니다. 전달받아야 할 파라미터가 1개인 경우, DTO클래스를 생성하는 것 대신, @RequestParam 혹은 Map을 활용하는 방법이 있는데요. @RequestParam을 사용하면 옵션을 줄 수 있다는 점, 올바르지 않은게 오면 400 코드를 준다는 점 정도가 다른 점이라고 생각합니다. 둘이 큰 차이가 없다고 생각하는데, Map을 사용하는 것에 대해 부정적인 의견도 많이 있는 것 같습니다. 한 개의 파라미터를 받기 위해 어느 방법을 사용하는 것이 효율적일까요? 상황마다 다른지, 보통 어떤식으로 처리하는지 궁금합니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO, VO, DAO, Repository에 관련한 질문드립니다.
안녕하세요 강의 정말 유익하게 잘 듣고 있습니다. 실무로 스프링을 접하며 강의를 같이 들으며 진행하고 있는데 들으면서 너무 헷갈리는 부분이 있어 문의드립니다. 1. DTO 와 VO의 차이 그리고 실무에서 어떤경우에 사용하는지 차이 DTO = 전송되는 데이터를 담는 객체 VO = getter/setter 로만 구성된 불변하는 데이터를 담는 객체 라고 표현이 되는데, 너무 와닿지가 않아서 정확한 차이점을 질문드리고 싶습니다. 추가로, 찾아본 예제들에서는 DTO와 VO를 혼합하여 사용하거나 아예 한쪽만 사용하는경우가 혼재되어 많이 헷갈립니다 실무에서는 어떤경우에 어떤 구조체를 사용하는건지 문의드립니다. 2. DAO와 Repository 의 차이점을 문의드립니다. 제가 알기론, 둘다 DB와 소통을 하는 로직을 구현하는건 같지만 DAO는 Data Persistence 를 구체화 한 것이고, 테이블과 더 Low level에서 연관성을 가지고 있고, Repository는 DAO보다 더 High level로 repository안에 여러개의 dao를 사용하여 구현하기도 하는것으로 알고 있습니다. 다만, 예제들을 찾아보면 누구는 DAO로만 구성하여 사용하고, 누구는 Repository만 구현하여 사용하여 실무에서 어떤경우에 DAO와 Repository를 사용하는지가 너무 헷갈립니다. DAO와 Repository가 실무에서 어느때에 사용되는건지 문의도 같이 드리고 싶습니다.
-
해결됨실전! Querydsl
DTO 클래스의 위치? 관련해서 질문 드립니다!
안녕하세요. 강의 너무나 잘 듣고 있어 언제나 감사드립니다. (_ _) DTO 관련해서 궁금점이 있어 질문드립니다. 제가 많이 본, 그리고 제가 지금도 쓰고있는 폴더 트리(패키지 구조)가 아래와 같이 사용하고 있습니다. - Model - | Repository - | Service - | Controller ▼ Service단의 경우에는 다른 서비스단에서 연계해서 사용될 수도 있다고 들은적이 있어서, 최대한 Model 클래스를 반환되도록 사용하고 있구요. 위와 연계해서 Controller단에서 Model 클래스를 DTO로 변환해서 반환을 했습니다. 그래서 DTO의 위치가 Controller 패키지에 위치시키고 있었습니다. 그런데 join 쿼리로 인해서 DTO를 Repository에서 반환하게 된다면, 해당 DTO의 위치가 맨 끝인 Controller 패키지에 있어도 되는 걸까요?
-
미해결실전! Querydsl
안녕하세요 DTO반환 관련 질문있습니다.
안녕하세요 영한님 강의 재밋게 잘보고 있습니다. 다름이 아니라 회사에서 QueryDSL 처음 도입을 하려고했는데 멀티?프로젝트로 현재 구성이 되어있습니다. 예를들면 Porjects projcet1 projcet2 projcet1Common 이런식으로 되어있고 projcet1 / projcet2 는 projcetCommon을 참조하는 구조입니다. 모든 Entity는 projcetCommon를 참조하고 있습니다. 근데 여기서 질문드리고 싶은것은 projcetCommon에는 공통으로 사용하는 util이나 Entity만 있고 각각 project마다 DTO는 다르게 사용을 합니다. 이유는 Entity는 자주 변화가 없지만 DTO는 자주 변할 가능성이 있기때문에 각각사용을 합니다. 제가 queryDSL로 서브쿼리를 사용하여 alias를 줘서 보내는 컬럼이 있는데 그거에 맞는 DTO는 project1 에 있다보니 Entity에 @Transient를 주어서 Entity반환을 해서 사용합니다.... Common에 DTO를 만드는것 말고는 다른 방법이 없을까요..?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
[User MicroService - 회원가입] 레이어별 다른 클래스 사용이유
VO나 Entity 클래스 하나만 생성해서 데이터를 주고 받을 수 있는데, modelmapper 라이브러리를 사용하면서까지 RequestUser, UserDto, UserEntity 클래스를 사용하는 이유가 무엇인가요?
-
미해결스프링 데이터 JPA
엔티티를 상속받는 DTO가 일반적인가요?
안녕하세요. 기선님 강의 너무 재밌게 잘 보고 있습니다. 질문드릴것이 있는데요 그전에 상황을 설명하면 이렇습니다. (이해하기 쉬우시게 한글로 적겠습니다) '병원' , '환자' 라고 하는 두 엔티티가 있습니다. 환자는 병원을 참조하고 있습니다(FK) @Entity@Getter @Setter@Builder @EqualsAndHashCode(of = "id")@AllArgsConstructor @NoArgsConstructorpublic class 병원 { @Id @GeneratedValue private Long id; private String name; . . . . // 환자 수 @Transient private Integer 환자수; } @Entity@Getter @Setter@EqualsAndHashCode(of = "id")@AllArgsConstructor@NoArgsConstructorpublic class 환자 { // 환자 아이디 @Id @GeneratedValue @Column(name = "PAT_ID") private Long id; // 병원 @ManyToOne @JoinColumn(name = "HOSP_ID") private 병원 병원; . . . .} 위와 같이 두 엔티티가 존재하는데 병원 리스트를 검색하면서 각 병원에서 수용중인 환자 수를 같이 하고 불러오고 싶습니다. 이를테면 환자수가 1명이상인 병원목록을 불러온다했을때 이걸 SQL로 작성하면 SELECT h.*, ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) as '환자수'FROM hospital hWHERE ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) > 1; (사실 이게 효율적인 SQL인지도 모르겠습니다만, 전 이렇게 보통 씁니다..) 처럼 작성할 수 있을건데요 이럴때 세가지 질문이 있습니다. 1. 병원 엔티티 클래스에 '환자수' 라는게 있는게 일단 맞는지 부터가 문제입니다. 병원 리스트를 조회할때 환자수가 몇명인지 정보도 같이 필요한 페이지도 있고 필요가 없는 페이지도 있습니다. 단, 환자수 정보가 필요할때는 '몇명 이상의 환자가 있는 병원 목록'과 같이 (위 SQL과 같이) where 절에 조건도 같이 붙게 됩니다. 환자수는 DTO로 따로 빼는게 맞을까요? 2. (1번질문에서 따로 빼는게 좋겠다고 하였을때) 환자수를 포함하는 병원DTO를 만든다고 했을때 사실 그 DTO는 병원의 모든 필드가 필요 합니다. 그래서 하려면 아래처럼 병원을 상속받는 식이 되어야 할텐데 이렇게 DTO 클래스가 엔티티 클래스를 상속받아도 문제가 없고, 이렇게 사용하는게 일반적으로 현업에서도 많이 있는 일인가요? public class 병원출력DTO extends 병원 { private Integer 환자수;} 3. 제가 하고자하는 것 ( 엔티티에 있는 모든 정보 + 서브쿼리를 통한 추가정보를 같이 불러오고 서브쿼리를 이용한 WHERE절 ) 이 굉장히 일반적으로 많이 쓰이는 것이라 분명 JPA 프로그래밍으로 충분히 쉽게 하는 방법이 이미 있을것 같은데 지식의 끊이 짧다보니 어떤 방법을 써야하는지 감을 못잡겠습니다. SELECT h.*, ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) as '환자수'FROM hospital hWHERE ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) > 1; 이런 것을 하기위해 제가 뭘 찾아보고 공부하면 되는지 키워드나 팁를 알려주실수 있을까요 (QueryDsl을 활용하면 될것 같긴한데.. )
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
DTO와 Schema를 작성할 때 중복 사용하게 되는 class-validator
좋은 강의 잘 듣고 있습니다. 회원가입 서비스 & DTO 패턴 강의를 듣고 있는 와중 class-validator를 schema에서 적용하시고 dto 클래스에도 적용하시는 것을 보고 의문이 들어 질문드립니다. 위와 같은 방식이면 나중에 class-validator로 인해 발생하는 문제를 쉽게 해결하지 못할 것 같은 구조가 될 것이라는 생각이 들었습니다. 관련 dto와 schema에 적용된 class-validator를 모두 확인해야 하니까요..? 현업 개발 시 위와 동일한 방식으로 작성하는 지 궁금합니다. 만약 다른 방식으로 작성하신다면 schema와 dto 모두 완전히 동일한 class-validator를 적용하나요? 아니면 dto에만 class-validator를 적용하나요? 효율적인 dto및 schema 내 class-validator 활용법에 대해서 좀 더 여쭈어 보고 싶습니다. 감사합니다.
-
미해결실전! 스프링 데이터 JPA
DTO로 조회시 DTO의 조회 위치는 어디가 되면 좋을까요..?
안녕하세요 강의를 보던 도중 의문이 생겨서 질문남깁니다. Layerd Architecture 에서 Controller, Service, Repository로 역할을 구분해서 레이어당 커플링을 줄이도록 하고 있는 알고 있습니다. 그런데 DTO 의 사용위치 (해당 DTO는 사용자 API)에 대해 궁금한 점이 있습니다. JPA에서 DTO로 조회하면 편하게 데이터를 가져 올수 있는데 해당 DTO가 서비스 혹은 Application Layer에 커플링이 생기는데 이럴 경우는 어떻게 해결해야 될까요..? DTO 자체를 Service DTO, 와 Controller DTO로 분리하여 컨버팅을 해주어야 되는지 아니면 Controller 에서 Repository 를 직접 사용해도 되는 예외상황을 고려해야될지가 고민입니다. 아니면 엔티티를 조회한후 필요한 부분만 DTO로 변환을 하는지 그것도 아니면 Object 객체로 조회한후 Object 안에서 데이터를 추출하는지 어떤 방법을 사용하시는지가 궁금합니다. 보통 이런 경우에는 어떻게 처리하는게 효율적인 방법일까요..? 시스템 개발을 하다가 서비스로 커리어 전환을 하고 있는데 김영한님 강의가 너무 재밌어서 계속 찾아보게 되네요 ㅎ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO관련 질문드립니다.
// Controller @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable("itemId") Long itemId, @ModelAttribute("form") BookForm form) { itemService.updateItem(new UpdateItemDto(form)); return "redirect:/items"; } // Entity @Entity @DiscriminatorValue("B") @Getter @Setter public class Book extends Item { private String author; private String isbn; public void updateBook(UpdateItemDto updateItemDto) { this.author = updateItemDto.getAuthor(); this.isbn = updateItemDto.getIsbn(); this.setId(updateItemDto.getId()); this.setName(updateItemDto.getName()); this.setPrice(updateItemDto.getPrice()); this.setStockQuantity(updateItemDto.getStockQuantity()); } } // Service @Transactional public void updateItem(UpdateItemDto updateItemDto) { Book foundedItem = (Book) itemRepository.findOne(updateItemDto.getId()); foundedItem.updateBook(updateItemDto); } 선생님 양질의 강의 잘보고있습니다. 엔티티에서 북이 아이템을 상속하고있는데 그 상속하는 필드에 값을 변경시 위의 코드와 같이 셋터를 불러서 값을 변경시켜주면될까요? 아니면 아이템에도 별도의 메소드를 생성하여 값을 변경해주는게 좋은가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JSON 객체 반환 무한루프문제 DTO
JSON 으로 반환하기 위해서 response 객체에 담으면 자동으로 JSON변환이 수행되고, 이 때 객체에 대한 JSON변환과 그 내부 또 다른 객체에 JSON변환 과정이 반복되어 무한루프가 생긴다고 이해했습니다! 그래서, Entity를 바로 반환하지 말고, DTO로 받은 후에 반환하라고 하셨는데 여기서 말씀하시는 Entity는 DB에서 바로 꺼낸 객체를 말씀하시는거고, DTO는 저희가 사용하는 domain을 말하는게 맞나요?