묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 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 활용1 - 웹 애플리케이션 개발
안녕하세요 트랜잭션 처리에 관해 질문드립니다.
안녕하세요, 팀장님! 트랜잭션을 엔티티 매니저를 직접 다루는 리포지토리에서 하는 것이랑 서비스 계층에서 하는 것이랑 어떤 차이가 있나요?@Transactional을 서비스 계층이 아니라 리포지토리에서도 걸 수 있는데 서비스 계층에서 거는 이유가 궁금합니다. 그리고 MVC 강의 출시는 언제쯤 예상하시나요?ㅎㅎ 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 부트 사용 vs 스프링 사용 정리
안녕하세요 강사님! 스프링 부트를 사용한 것과 사용하지 않고 하는 방법이 헷갈려서 아래 질문들이랑 강의를 토대로 정리해봤는데 제가 이해한 내용이 맞나요? 번거로운 질문 드려서 죄송합니다ㅜ /** * # spring boot 사용 x * new AnnotationConfigApplicationContext(AutoAppConfig.class); * 1. ApplicatonContext(스프링 컨테이너) 생성 * 2. AutoAppConfig를 스프링 빈으로 등록 * 3. AutoAppConfig에 @ComponentScan이 달려있으므로, @Component 어노테이션이 달려있는 클래스를 스프링 컨테이너에 빈으로 등록 * * # spring boot 사용 * 1-1. @SpringBootApplication 이 붙어있는 class(이 예제에서는 CoreApplication)의 main 함수가 실행. * 1-2. @SpringBootTest 테스트 실행 -> @SpringBootApplication 어노테이션을 찾아감 * 2. 위 둘 중 하나를 하면 스프링부트 내부에서 자동으로 ApplicationContext (스프링 컨테이너)를 생성. * 3. @SpringBootApplication에는 @ComponentScan이 포함되어 있음. * => @Component 어노테이션이 달려있는 클래스를 스프링 컨테이너에 빈으로 등록 * (@Configuration에도 @Component가 포함되어있으므로 이 어노테이션이 달려있는 설정 클래스도 빈으로 컨테이너에 등록, * 이때 만약 @Bean 어노테이션이 있으면 빈을 컨테이너에 등록) */ 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
수강을 시작하기 전에 한 가지 질문을 드립니다.
안녕하세요 강사님, 이번 강의도 잘 듣겠습니다.이번 강의를 본격적으로 시작하기 전에 질문을 하나 드리려고 합니다. 저는 현재 강사님의 스프링 입문편, 기본편, HTTP 강의를 완강한 상태입니다. 이제부터는 강사님께서 추천해주신 야생형 코스로 JPA 로드맵을 수강하고자 하는데요.이번 강의를 어떤식으로 공부하는게 좋을지 고민입니다. 저는 아직 JPA 기본편을 듣지 않았기 때문에 JPA에 대한 사전지식이 전무합니다. 이런 상황에서 활용편 강의를 수강하게 되면 분명히 막히는 부분이 많이 나오겠지요. 그럴 때마다 그런 부분들에 대한 이해를 하기 위해 노력하면서 들어야 할까요? 아니면 이해가 안 되는 부분은 그냥 따라치기만 하면서 넘어가고 나중에 기본편 학습 후 다시 돌아왔을때 철저한 이해를 목표로 수강하는게 좋을까요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 추가적으로, JPA라는 기술에 대한 질문을 하나 더 드리고 싶습니다. 흔히들 말하는 국내 대표 IT 서비스 기업 "네카라쿠배" 같은 곳에서는 JPA 기술이 활발하게 사용될 것이라는 생각이 듭니다. 그러나 취업을 준비하는 취준생 입장에서 이러한 탑급 IT 기업만을 목표로 하여 JPA에만 집중하는 것이 맞는지에 대한 고민이 있습니다. 갈 수만 있다면 자체 IT 서비스를 운영하는 저런 거대 기업들에 가는 것이 좋기야 하겠지만.. 국내 대형 SI 기업들, 그 외 대기업 계열사들, 다른 중견기업들 등 최대한 포괄적으로 준비하여 "취업 1승"에 대한 성공 확률을 최대한 높이고 싶은 것이 불안한 취준생의 마음입니다. 이러한 측면에서 보았을 때, 최신 트렌드인 JPA만 공부하기 보다는 아직 그렇지 못한 기업들을 함께 고려하여 MyBatis 등의 기술도 준비해서 프로젝트를 진행해보는게 맞는 것인가? 하는 생각이 듭니다. 질문의 핵심은 이것입니다. "네카라쿠배 등의 IT 기업 외에 다른 곳들에서 JPA를 활발하게 사용하나요? 그렇지 않다면 다른 곳들에서 가장 활발히 사용되는 기술은 무엇인가요?" 물론 강사님께서 모든 기업에 근무하셨던 것은 아니니 전부 빠삭하게 꿰차고 답변을 주시기는 어렵겠지만.. 그래도 현직 베테랑 개발자의 입장에서 저같은 취준생에게 조언을 해주실 수 있는 부분이 있지 않을까 싶어서 질문을 남깁니다. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 부디 조언을 부탁드립니다. 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
form, DTO 차이
안녕하세요 강사님. 공부를 하던중 form 과 DTO에 차이에 대해 궁금한점이 생겨 질문 드립니다. form은 아래와 같이 컨트롤러에서 Model에 담아 뷰에 전달 할때 사용하셨고 DTO는 아래와 같이 데이터를 반환할때 엔티티를 DTO로 변환하여 사용하셨는데 이때, 위의 경우처럼 form과 DTO가 사용되는 영역이 완전히 다른것인가요?? 예를들어, memberForm이 memberDTO로써 역할을 수행할 수 있다면 DTO로도 사용해도 되는것인가요? 제가 생각했을 땐 form은 validation이 들어갈 수 있기 때문에 DTO로 사용하면 안될것 같기도하면서도 그냥 DTO로 사용해도 될 것 같기도 하고 의문이 들어 질문드립니다. 항상 좋은 강의 감사드립니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API Response Header
안녕하세요 영한님! API Response를 리턴할때 header를 포함하고싶을때 어떻게 해야할까요? 제네릭으로 Header를 따로 만들어야하는지, HTTPSERVLETRESPONSE를 이용해야하는지 궁금합니다. 고맙습니다! 건강하세요
-
미해결스프링 핵심 원리 - 기본편
서버 ? 클라이언트?
안녕하세요. 항상 강의 즐겁게 잘 보고있습니다. AppConfig를 제외한 클라이언트 코드에 변경이 없다고 하셨는데, 이 어플리케이션을 만약 배포한다면 하나의 서버로 동작하게 되는게 아닌가요? ㅠ 이 부분이 헷갈려요. discount, member, order 패키지들이 클라이언트라 말씀하시는건지 궁금해요. 아니면, 3개의 지점으로 이루어져서, (클라이언트 / 사용자가 데이터를 사용하게 되는 지점) <-> (서버 / hello.core 의 핵심 내용) <-> (설정자 / AppConfig) 이런 아키텍쳐가 되어서, 설정자만 업데이트해도 클라이언트와 서버(서버란 표현이 애매하네요, 이것도 서버이자 클라이언트라고 볼 수도 있으려나..?)는 업데이트하지 않아도 되어서 클라이언트라고 표현하신건가요 !?
-
해결됨실전! 스프링 부트와 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 활용1 - 웹 애플리케이션 개발
cannot resolve column 'Object'
이렇게 빨간줄이 떠서 신경쓰이시는 분들은 Settings -> Editor -> Inspections 에서 Unresolved database를 검색 -> Unresolved database references in annotaions 를 체크 해제 하시면 빨간줄이 없어집니다. IntelliJ가 너무 꼼꼼하게 검사를 해주기 때문에 발생한다고 합니다. 출처: https://log-laboratory.tistory.com/285
-
미해결실전! 스프링 데이터 JPA
즉시로딩 처리 시 findAll()일 경우 동작이 안되는 이유가 궁금합니다.
강의 중에는 실무에선 즉시로딩을 사용하지 말라고 하셨지만 테스트 차원에서 즉시로딩으로 findAll()을 조회하면 내부에서 left outer join이 걸리는 않는 현상을 확인했습니다. 동일한 조건에서 findById()로 처리하면 left outer join이 걸립니다. OneToMany, ManyToOne 모두 동일하게 동작을 하던데 혹시 이렇게 동작되는 이유가 있을까요??? 미리 답변 감사드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderItem을 DB에서 지우고자 할 때
안녕하세요. 주신 예제로 여러 가지 응용을 해보고 있는데, 한 가지 질문이 있어 질문드립니다. OrderItem을 지우는 상황을 가정을 했을 때, 지우는 방법에 대해 여쭤보고 싶습니다. (parent에 의존하여 영속화 되어있는 객체를 지우는 상황) Order를 지우면 OrderItem은 CASCADE 옵션 덕분에 잘 지워지지만, 반대로 Order는 두고 OrderItem 하나만 지우기 위해 Order <-> OrderItem 관계를 끊어도 OrderItem은 지워지지 않습니다. 아래는 제가 시도했던 부분입니다. - Parent인 Order의 list에서 OrderItem 삭제 - Child인 OrderItem에서 this.order = null; this.item = null;로 모든 관계 삭제 - @OneToMany 옵션이 있는 Parent쪽에서 orphanRemoval = true 옵션 넣기 - 위 과정 모두 한 뒤, em.persist(Order); 호출 위 모두 해보아도 OrderItem에 null로 들어갈뿐 OrderItem이 삭제 되진 않습니다. 구글링을 해봤을 땐 orphanRemoval 옵션 추가하고 연관관계 삭제하라는 말뿐이네요.. 혹시 방법이 있을까요? 그리고 추가로, 여기선 OrderItem이라는 다:1 매핑된 객체는 CASCADE를 통해 따로 영속화하지 않았는데, 보통 다:1 매핑은 전부 그러한가요? 제가 느끼기엔 서로 독립적으로 저장해야할 때라고 판단하였는데, 다:1이면 독립적일 수가 없을 것 같더라구요. 어떤 경우에 따로따로 영속화하고, 어떤 경우는 이 예시와 같이 한꺼번에 하는지 궁금합니다. 감사합니다.
-
미해결실전! 스프링 부트와 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 활용1 - 웹 애플리케이션 개발
안녕하십니까 강사님 주문하기에서 질문이 있습니다
주문하기 service입니다. 여기보시면 itemId로 하나의 아이템을 조회해서 ---> OrderItem에 파라미터로 item을 등록하지 않습니까? 궁금한 점이 있는데 만약 하나의 아이템이 아니라, 여러가지 아이템을 한번에 주문하고 싶다면 위 코드를 어떻게 바꿔야 할까요? Order의 createOrder은 파라미터를 (OrderItem... orderitem)으로 여러가지 아이템들이 올 수 있도록 만들어놨는데, 여러가지 아이템을 등록하기 위해서는 OrderItem의 createOrderItem을 어떻게 바꿔야 하는지 궁금합니다.
-
미해결예제로 배우는 스프링 입문 (개정판)
안녕하세요
스프링을 처음 접하는데 수준이 너무 높은것같은데 토비의 스프링이라도 읽으면서 정리하는게 좋을까요 아니면 그냥 수업을 들으면서 모르는걸 바로바로 찾아보면서 공부하는게 좋을까요p.s(로드맵 순서대로 배울 생각입니다)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 초록색 단축키 알리미 질문
안녕하세요 강의 듣고 따라해보고 있는 학생으로서 IDE에 대해 간단한 질문인데요..! 강의 중간에 보면 인텔리제이 하단에 초록색으로 어떤 단축키를 통해서 무엇을 할 수 있다고 뜨는 것 같은데 제 인텔리제이에서는 그게 안뜨더라구요. 혹시 어떻게 나올 수 있게할 수 있는지 여쭤봐도 될까요...? 강의 잘 듣고 있습니다!
-
미해결스프링 핵심 원리 - 기본편
AppConfig에서 생성자로 주입되는 원리
안녕하세요. 비전공자 백엔드 개발자 준비중입니다. 강사님 좋은 강의 덕분에 spring 공부에 큰 도움이 되고 있습니다. AppConfig에서 역할과 구현을 나누어 구현체를 쉽게 바꿀 수 있다는 원리는 이해하였습니다. 여기서 제가 궁금한게 어떻게 AppConfig에서 메소드를 만들어 구현체를 넣어주면 생성자를 통해 받을 수 있는지, 그 원리가 궁금합니다. 생성자에서 this.객체 = 객체 이런식으로 받는데, AppConfig에서 넣어준 값이 어떻게 해서 이런 원리로 주입이 되는건가요? 제가 생성자 개념이 부족해서 이해가 안되는 것 같기도 하네요... 그리고 Test에서는 AppConfig 인스턴스를 생성해서 넣어줬는데, 왜 실제로는 그렇게 해주지 않은건가요? 메모리 낭비 때문에 그런걸까요? 인스턴스 생성 해서 넣어주는 부분은 이해가 되는데, 생성자로 주입해주는 부분은 원리가 이해가 되질 않네요.
-
미해결스프링 핵심 원리 - 기본편
자동등록에서는 이 방법을 사용할 수 없나요?
@Component에서도 적용이 될까 싶어서 @Component(initMethod = "init", detroyMethod = "close") 를 해봤는데 컴파일 에러가 나네요. 이 방법은 수동 등록에서만 가능한 방법인건가요?
-
해결됨스프링 핵심 원리 - 기본편
안녕하세요!
안녕하세요~ 강의를 듣다가 궁금한 점이 생겨서 질문 남깁니다! @Bean의 initMethod, destroyMethod 속성을 사용하면 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다고 하셨는데 외부 라이브러리 코드를 고칠 수 없는 상황에서 어떤 의미로 적용이 가능한지 궁금해서 질문 드립니다!외부 라이브러리에 이미 구현되어있는 메소드를 초기화나 종료 시 구현해야하는 메소드로 지정해준다는 뜻인가요?? 답변 주시면 감사드립니다! 또, 항상 강의 너무 잘 보고있습니다! 좋은 강의 찍어주셔서 정말 감사드려요 :))
-
미해결스프링 핵심 원리 - 기본편
@Primary방법과 @Autowired 필드명 방법 간의 우선순위
안녕하십니까 강의 항상 감사드립니다. 다름이 아니오라 생성자 주입을 사용하는 경우에 생성자의 Parameter 명을 rateDiscountPolicy로 네이밍하였고 동시에 테스트를 위해 FixDiscountPolicy 클래스 정의 위에 @Primary를 작성하여 과연 '@Primary방법'과 '@Autowired 필드명 방법'이 동시에 사용되었을 떄 어떤것이 적용 되는지 확인을 해보았습니다. 그 결과로 아무리 생성자의 Parameter명을 'Spring Container의 Bean Naming'에 따라 네이밍 했다고 하더라도 @Primary 애노테이션이 기재된 타입이 우선순위로 책정되어 OrderServiceImpl은 RateDiscountPolicy가 아닌 FixDiscountPolicy에 의존하게 되더군요 제가 아직 단위 테스트 코드 작성에 단련되지 않은터라 제가 한 테스트 결과가 맞는 것인지 여쭙고자 질문 남기게 되었습니다. 답변 부탁드립니다. 항상 현업에 바쁘신 와중에도 늦은시각 까지 강의질문 답변에 신경써주셔서 감사합니다. ^^
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO class 선언 및 update 시 id 조회 질문
안녕하세요. 두 가지 질문이 있어 이렇게 질문을 적어봅니다. 1. inner class를 왜 static으로 선언하나요? private으로 하면 물론 코드가 돌아가는 방식은 다르지만, 잘 돌아가더라구요. 혹시 실무에 적용한다면 어떤 문제점이 있나요? (다음 강의에서는 아무 것도 붙이지 않은 상태로 작성하신 것을 보니, 별로 임팩트 있는 부분은 아닌가보군요 ^^;) 2. 이건 간단한 질문인데, updateMemberV2 메서드에서 merberService.update 후, id로 update를 날렸음에도 id를 다시 찾아오시더라구요. id로 Member를 찾고 그로부터 getId를 다시 하는 이유가 있을까요? (수강자료에서 updateMemberV2 메서드 부분에 fineOne이라고 오타 있습니다.!) 항상 좋은 강의 감사드립니다.