25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 사용시기에 대한 질문
안녕하세요. 항상 강의 잘 듣고있습니다 ! 질문이 두가지 있습니다. 첫째, "어느 레이어에서 DTO로 반환하는가?" 입니다. 현재 강의에서는 controller 에서 repository 를 바로 di 해서 사용하고 있으므로 서비스 레이어가 존재하지않는 것 같습니다. 하지만 만약 서비스레이어가 존재한다면, 지금 컨트롤러에서 작업되고있는 dto 변환 로직이 서비스에 들어가는것인가요. 아니면 서비스까지는 entity 를 유지한채 controller 에서 dto 로 변환되는 로직이 들어가는걸까요? (물론 정답이 없는 아키텍쳐링에 대한 질문입니다만, 대체적으로 어떻게 사용하고있는지 그리고 영한님의 노하우에 대해 궁금합니다. 구글링과 여러 블로그들을 보면 보통 controller 가 아닌 service 에서 dto 를 변환하는것이 낫다고 하여 혼란이옵니다.) 둘째, "Create, Update같은 것에선 언제 DTO로 반환하는가?" 입니다. 흔히 서비스쪽에서 dto 를 변환한다고 하니, 이것을 가정하고 아래와같은 코드를 작성해봤습니다. [#1] Entity class XXEntity { String id, Sting name } class YYEntity { String id, Sting title, XXEntity xx } [#2] Repository SampleRepository 는 JPA 레포지토리 XXRepository, YYRepository [#3] Service XXService 는 XXRepository를 DI 해서 비지니스로직을 돌려 나온 Entity를 Dto를 반환한다. YYService 는 YYRepository를 DI 해서 비지니스로직을 돌려 나온 Entity를 Dto를 반환한다. [#4] Controller SampleController 의 createXY DI : XXService DI : YYService xId 를 이용하여 XXService에서 찾은 A를 YYService의 create 에 넣어 YY를 만들어 리턴한다. XXDto found = XXService.findById(id) XX foundToEntity = XXDto.toEntity() // <-- 서비스레이어에서 dto 를 반환할때, 이부분이 너무 불편합니다. YYDto saved = YYService.create(new YYY("a", "b", foundToEntity)) return saved 보통 ****** 에 XX의 entitiy가 들어가는데 만약 서비스로직에서 dto 로 변환해서 내려주고있다면, 현재 XX에서는 dto를 받고있으니 이걸 다시 entitiy방식으로 변환시켜서 넣어주어야 하는데, 이것이 매우 불편하고 왠지 이런 방식으로 하는게 아닌것같아서요. 이때도 마찬가지로 service쪽까지는 entity로 유지하다가, controller 에서 변환을 시켜야되는것인지 궁금합니다. <추가> 저는 지금 혼란이 오는 것이 DTO 란 무엇인가입니다."외부에 entity를 노출시키면안되기 때문에 dto 로 변환해야한다" 라는 것도 있지만, 레이어간 데이터 이동을 위해서 만들어진것이 dto이기도 하니 어떤측면에서 바라보며 사용해야할지 혼란이 옵니다. 도움을 부탁드립니다 !!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
form, DTO 차이
안녕하세요 강사님. 공부를 하던중 form 과 DTO에 차이에 대해 궁금한점이 생겨 질문 드립니다. form은 아래와 같이 컨트롤러에서 Model에 담아 뷰에 전달 할때 사용하셨고 DTO는 아래와 같이 데이터를 반환할때 엔티티를 DTO로 변환하여 사용하셨는데 이때, 위의 경우처럼 form과 DTO가 사용되는 영역이 완전히 다른것인가요?? 예를들어, memberForm이 memberDTO로써 역할을 수행할 수 있다면 DTO로도 사용해도 되는것인가요? 제가 생각했을 땐 form은 validation이 들어갈 수 있기 때문에 DTO로 사용하면 안될것 같기도하면서도 그냥 DTO로 사용해도 될 것 같기도 하고 의문이 들어 질문드립니다. 항상 좋은 강의 감사드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
request로 이름 받아올때 질문
member.setName(request.getName()) 으로 request에서 이름을 가져오셨는데 getter가 없는데도 getName()이 자동으로 생성되나요? 아니면 @Date안에 getter setter가 있는 건가요..? 그리고 member.setName(request.name)으로 받아오는거랑 getName()으로 받아오는거랑 차이가 있나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API Response Header
안녕하세요 영한님! API Response를 리턴할때 header를 포함하고싶을때 어떻게 해야할까요? 제네릭으로 Header를 따로 만들어야하는지, HTTPSERVLETRESPONSE를 이용해야하는지 궁금합니다. 고맙습니다! 건강하세요
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페치조인 최적화 질문 드립니다!
강의 잘 듣고 있습니다.!!!!! 페치조인 최적화 강의 중, 페치조인에 대해 갑자기 궁금증이 생겨서 질문 드립니다.! 페치조인을 할때, 데이터 정합성? 이 깨지지 않는 다면(ManyToOne, OneToOne) 제가 작성한 예제와 같이 페치조인에도 where 조건을 걸어서 사용해도 문제가 없는 코드가 맞겠죠 ?? public List<Order> findWithMemberDelivery(Long order_id){ return em.createQuery("select o from Order o " + "join fetch o.member " + "join fetch o.delivery " + "where o.id = :order_id", Order.class) .setParameter("order_id", order_id) .getResultList(); }
- 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
gradle6에서 build.gradle 셋팅
삭제된 글입니다
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님! 질문 드립니다!
자주 질문으로 귀찮게 해드려 죄송합니다! 등록, 수정, 조회 api 강의를 다 듣고, 복습개념으로 api를 다시 만들어 보았는데, 제가 제대로 이해하고 만든 api가 맞을까요..!? /** * 등록 API */ @Data public static class SaveMemberReq{ @NotEmpty private String name; private String city; private String street; private String zipcode; } @Data @AllArgsConstructor public static class SaveMemberResp{ private Long member_id; } @PostMapping("/api/v1/saveMember") public SaveMemberResp saveMember(@RequestBody @Valid SaveMemberReq req) { Address address = new Address(req.getCity(), req.getStreet(), req.getZipcode()); Member member = new Member(req.getName(), address); memberService.memberSave(member); return new SaveMemberResp(member.getId()); } /** * 수정 api */ @Data public static class UpdateMemberReq { private Long member_id; private String name; private String city; private String street; private String zipcode; } @Data @AllArgsConstructor public static class UpdateMemberResp{ private String name; } @PostMapping("/api/v1/updateMember") public UpdateMemberResp updateMember(@RequestBody @Valid UpdateMemberReq req) { Member member = memberService.memberFind(req.getMember_id()); Address address = new Address(req.getCity(), req.getStreet(), req.getZipcode()); //변경감지 memberService.memberUpdate(member, req.getName(), address); return new UpdateMemberResp(member.getName()); } /** * 조회 api */ @Data @AllArgsConstructor public static class SearchMemberDto{ private String name; private String city; private String street; private String zipcode; } @Data @AllArgsConstructor public static class SearchMemberResp<T>{ private int count; private T data; } @GetMapping("/api/v1/searchMember") public SearchMemberResp<List<SearchMemberDto>> searchMember(){ List<SearchMemberDto> dtos = new ArrayList<MemberApiController.SearchMemberDto>(); List<Member> memberList = memberService.memberList(); for(Member member : memberList) { dtos.add(new SearchMemberDto(member.getName(), member.getAddress().getCity(), member.getAddress().getStreet(), member.getAddress().getZipcode())); } return new SearchMemberResp<List<SearchMemberDto>>(dtos.size(),dtos); }
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회 API 질문 드립니다!
안녕하세요 강의를 잘 듣고 있습니다. 조회 API 를 만들때, 제네릭으로 json 리스트 형태를 감싸서리턴을 하는데, 보통 조회API 는 단건 조회가 아닌 이상 리스트형태로 리턴을 할텐데, 이런 조회 API 에서는 제네릭으로 리스트를 한번 감싼 뒤 리턴을 해야한다. 로 이해해도 될까요? @GetMapping("/api/v2/members") public Result<List<MemberDto>> memberV2() { List<MemberDto> memberDtos = new ArrayList<MemberApiController.MemberDto>(); List<Member> findMembers = memberService.findMembers(); for(Member member : findMembers) { memberDtos.add(new MemberDto(member.getName())); } return new Result<List<MemberDto>>(memberDtos.size(), memberDtos); } @Data @AllArgsConstructor public static class Result<T>{ private int count; private T data; } @Data @AllArgsConstructor public static class MemberDto{ private String name; }
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님! 질문이있습니다.
강사님 ! 안녕하세요 강의 잘 듣고 있습니다. 다름이아니라, 회원등록 API를 만드실 때, Inner 클래스를 이용하여 Response, Request 객체를 만들어서 사용하셨는데, API를 만들어 사용할 때 는반드시 Response, Request 객체로 사용할 클래스는 Inner 클래스로 사용해야 하나요 ? ? 추가로, 예를 들어서 api 패키지 하위 패키지로 restController 패키지와 dto 패키지를 따로 만들어 클래스 객체를 관리해도 되나요?만약 된다면 Inner 클래스로 만들어 사용하는 것과 비교해 안좋은 점이 무엇일까요 ?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa @Table indexes 에 대해서 질문드립니다.
@Table 어노테이션을 보던중에 indexes 라는 프로퍼티를 발견해서 보니 인텍스를 설정하는 속성이라고 하던데 이 속성을 넣어주면 index table이 제가 정의해준 인덱스 테이블과 디비에서 기본으로 제공해주는 인덱스 테이블 2개가 생기는건가요? 아니면 이 속성을 넣어주면 db defult인덱스 테이블이 안만들어 지나요? 그리고 h2 에서 show index from {table 이름} 했을 때 신텍스 에러가 뜨는데 h2는 index 확인하는 방법이 뭐가 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
질문 있습니다.
안녕하세요. 좋은강의 잘 듣고 있습니다. 질문 목록중 이미 어느분이 Dto의 위치에 대해 질문하신게 있어서 읽어봤는데, 특정 repository에서만 쓰이면 해당 계층에만 선언을 해 놓는다는 뜻이 강의내용처럼 정적중첩클래스로 사용하신다는게 맞나요? 그리고 보통 맨 뒤에 XXXDto 처럼 Dto라는 이름을 붙여서 사용하나요? 아니면 이전에 MemberApiController에서 했던것처럼 XXXRequest 혹은 XXXResponse처럼 사용하는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
update 중복 회원 검출
안녕하세요 선생님! 매번 좋은 강의 잘 듣고 있습니다 ㅎㅎ 강의에 매료되어 남은 강의 모두 구매해버렸어요!! 덕분에 너무 재미있게 학습하고 있습니다 ^^ 회원 수정 부분에 동일이름 회원 중복 검출이 안 되는 것 같아 다음 내용을 추가하면 되는 것인 지 궁금합니다. MemberService.java /** * 회원 수정 */ @Transactional public void update(Long id, String name) { Member member = memberRepository.findOne(id); validateDuplicateMember(member); // 추가한 부분 member.setName(name); } 좋은 강의 만들어 주셔서 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
성능 실무 적용 질문 드립니다..!
안녕하세요 강사님 강의들 잘 보고있습니다. 덕분에 실무에서 도움이 많이 됩니다. 좋은 강의 감사합니다. 우선 실무에서 성능 이슈가 심각하게 발생해서 강의 내용을 토대로 성능 이슈를 해결해보려고 시도해봤지만 근본적으로 해결이 되지 않아 혹시나 다른 추가적인 방법이 있을까 해서 질문 남겨봅니다..! 우선 db 조회시 400ms 안팎으로 성능이 나오고 post man으로 로컬에 테스트해봐도 400ms 안팎으로 나옵니다. 문제는 ngrinder로 agnet = 1, total Vusers = 2로 테스트해보면 tps가 1~10정도 나오고 나중에는 IO Exception이 터집니다. (평균 응답속도 3000 이상) 단순 querydsl에서 조회 로직만 수행하는 데 이정도 성능이 나오면 어떤걸 고쳐야할까요? left조인이 3번, inner조인 2번, 서브쿼리 2번을 실행하는 쿼리문입니다..!
- 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
객체를 리턴해도
삭제된 글입니다
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의문서 오타 제보 드립니다.
안녕하세요 강사님 강의 문서 오타 제보 드립니다. 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의문서 오타 제보 드립니다.
안녕하세요 강사님 강의 문서 오타 제보 드립니다. 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
혹시나 인텔리제이가 아니라 이클립스로 진행하시는 분을 위해....
1. build.gradle에 추가 // 14-1. queryDSL을 위한 dependency implementation 'com.querydsl:querydsl-jpa' implementation 'com.querydsl:querydsl-apt' /* 14-2. queryDSL을 위한 dependency를 받기 위해서 buildscript를 적어준다 */ buildscript { dependencies { classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10") } } /* 14-3. queryDSL plugin apply */ apply plugin: "com.ewerk.gradle.plugins.querydsl" /* 14-4. querydsl */ def querydslDir = 'src/main/generated' querydsl { library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { main { java { srcDirs = ['src/main/java', querydslDir] } } } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } configurations { querydsl.extendsFrom compileClasspath } 2. 1번을 다 입력했다면 gradle represh 한번 해주고 3-1. 첫번째 방법 (1) cmd 창을 켜서 프로젝트가 저장되어 있는 폴더 경로로 들어간다. -> 여기서는 D:\workspace(jpa)\shopJpa (2) .\gradlew build를 실행 (3) src 밑에 generated폴더가 생성된다. 3-2. 두번째 방법 (1) 이클립스 상단 메뉴에서 window 클릭 (2) Show View -> other -> gradle 검색 -> Gradle Task 클릭 (3) Gradle Task에서 해당 프로젝트를 더블클릭 (4) build 폴더로 가서 build를 선택 후 마우스 오른쪽 클릭 (5) Run Gradle Tasks를 클릭하면 src 밑에 generated 폴더가 생성된다. 4. 프로젝트에 새로 생긴 generated의 경로를 추가해줘야 사용 가능 (1) 프로젝트 우클릭 -> Properties ->Java build Path (2) Source 탭에서 Add Folder... 클릭 (3) src 밑에 새로 생긴 generated폴더 체크 후 확인 (4) apply 클릭 후 확인 (5) 이제 src/main/java에서 src/main/generated를 접근해서 사용할 수 있다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Inner Join VS Left Join
Inner Join 이 발생하려면, @ManyToOne 에서 @JoinColumn 의 nullable =false 이거나, @ManyToOne.optional=false 로 설정해야한다고 하셨는데요, 이번 강의에서는 이러한 설정이 없었음에도 iniiner join 으로 사용되는 이유가 궁금합니다. 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
특정엔티티의 영속성 컨텍스트 유지
안녕하세요 영한님 제가 개발을 하다가 막히는부분이 있어 질문드립니다. 현재 세션이 아닌 토큰 발급 방식으로 개발을 했는데 문제는 토큰 유효성 검사를 하는 필터에서 db에 해당 토큰의 시그니쳐로 유저 엔티티를 조회한다는겁니다.. 여기서 문제가 서비스레이어에서는 또 유저 엔티티를 조회하다보니 중복된 쿼리가 날라갑니다.. 하이버네이트 2차 캐시를 적용해봤지만 서버가 다중화 되어있다보니 문제가 생길것 같습니다.. 필터에서 조회한 유저 엔티티를 서비스레이어 트랜잭션 까지만 유지하고 싶은데 혹시 방법이 있을까요? OSIV 외에 다른 방법이 있을지 해서 문의드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO class 선언 및 update 시 id 조회 질문
안녕하세요. 두 가지 질문이 있어 이렇게 질문을 적어봅니다. 1. inner class를 왜 static으로 선언하나요? private으로 하면 물론 코드가 돌아가는 방식은 다르지만, 잘 돌아가더라구요. 혹시 실무에 적용한다면 어떤 문제점이 있나요? (다음 강의에서는 아무 것도 붙이지 않은 상태로 작성하신 것을 보니, 별로 임팩트 있는 부분은 아닌가보군요 ^^;) 2. 이건 간단한 질문인데, updateMemberV2 메서드에서 merberService.update 후, id로 update를 날렸음에도 id를 다시 찾아오시더라구요. id로 Member를 찾고 그로부터 getId를 다시 하는 이유가 있을까요? (수강자료에서 updateMemberV2 메서드 부분에 fineOne이라고 오타 있습니다.!) 항상 좋은 강의 감사드립니다.