실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
수강정보
(94개의 수강평)
1555명의 수강생
5개월 할부시
월 17,600원88,000원
지식공유자 : 김영한
23회 수업 · 총 6시간 38분 수업
기간 : 평생 무제한 시청
수료증 : 발급 강의
수강 난이도 : 중급이상
Chung A 프로필

oneToMany 관계의 엔티티 값들을 일부 변경하여 새롭게 insert하는 방법에 대하여 질문드립니다! Chung A 4시간 전
안녕하세요 강사님! 항상 빠르고 명쾌한 답변 감사드립니다:D   강의에서 알려주신 일대 다 관계의 엔티티는 ToOne관계의 데이터들을 조회한 뒤 ToMany관계의 컬렉션들을 따로 조회해서 붙여주는 내용에 대한 실습을 하던 중이였는데요, 여기서 추가로 기존에 DB에 있는 엔티티를 ID값만 바꿔서 새로운 엔티티로 insert하고자 하다가  생각한대로 동작이 잘 안되서 질문드립니다.   여기서 이 엔티티를 insert하고 끝날줄 알았는데 insert가 끝나고 복수의 update문이 실행됩니다ㅠ 이 현상에 대해 아무리 생각해도 모르겠어서 질문드립니다!   아래는 테스트했던 소스코드입니다! 혹시 몰라서 같이 첨부드립니다   [부모 엔티티-TestEntity] @Entity@Datapublic class TestEntity { @Id private String parentId; private String parentName; @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL) @JoinColumn(name = "parentId") private List<ChildEntity> childList;} [자식 엔티티-childEntity] @Entity@Datapublic class ChildEntity { @Id private String childId; private String parentId; private String childName;}   [Controller] @RestControllerpublic class TestController { @Autowired TestRepository testRepository; @GetMapping("/entityTest") public String entityTest(){ List<TestEntity> list=testRepository.selectParentByName("parent"); List<String> idList = list.stream().map(TestEntity::getParentId).collect(Collectors.toList()); Map<String, List<ChildEntity>> collect = testRepository.selectChildList(idList) .stream().collect(Collectors.groupingBy(ChildEntity::getParentId)); List<TestEntity> result = list.stream().map( p -> copyParentEntity(p,collect.get(p.getParentId())) ).collect(Collectors.toList()); testRepository.saveAll(result); return "test"; } public TestEntity copyParentEntity(TestEntity t,List<ChildEntity> childList){ TestEntity newTest=new TestEntity(); newTest.setParentId("C"+ System.currentTimeMillis()+"_"+t.getParentId()); newTest.setParentName(t.getParentName()); newTest.setChildList(copyChildList(childList,newTest.getParentId())); return newTest; } private List<ChildEntity> copyChildList(List<ChildEntity> childList, String parentId){ ArrayList<ChildEntity> result = new ArrayList<>(); for (int i=0;i<childList.size();i++) { ChildEntity c=new ChildEntity(); c.setChildId(parentId+i); c.setParentId(parentId); c.setChildName(childList.get(i).getChildName()); result.add(c); } return result; }}   [리포지토리-TestRepository] public interface TestRepository extends JpaRepository<TestEntity,String> { @Query("select t from TestEntity t " + "where t.parentName=:parentName") List<TestEntity> selectParentByName(@Param("parentName")String parentName); @Query("select c from ChildEntity c " + "where c.parentId in :parentIds") List<ChildEntity> selectChildList(@Param("parentIds")List<String> ids);} [DB데이터-parentEntity] [DB데이터-childEntity] ▶실행결과 로그   1) insert문 insert into test_entity (parent_name, parent_id) values ('parent', 'C1600949255895_1'); insert into child_entity (child_name, parent_id, child_id) values ('child1', 'C1600949255895_1', 'C1600949255895_10'); insert into child_entity (child_name, parent_id, child_id) values ('child2', 'C1600949255895_1', 'C1600949255895_11'); insert into test_entity (parent_name, parent_id) values ('parent', 'C1600949255895_2'); insert into child_entity (child_name, parent_id, child_id) values ('child3', 'C1600949255895_2', 'C1600949255895_20'); insert into child_entity (child_name, parent_id, child_id) values ('chlid4', 'C1600949255895_2', 'C1600949255895_21');   2) update문 update child_entity set parent_id='C1600949255895_1' where child_id='C1600949255895_10'; update child_entity set parent_id='C1600949255895_1' where child_id='C1600949255895_11'; update child_entity set parent_id='C1600949255895_2' where child_id='C1600949255895_20'; update child_entity set parent_id='C1600949255895_2' where child_id='C1600949255895_21';   보시다시피 이미 insert에서 parent_id값들이 다 제대로 들어가고 있는데 같은 값을 set해주는 update문이 실행되고 있어서 왜그런지 모르겠네요...   아니면 혹시 제가 한 방법 외에 엔티티를 복사해주는 좋은 방법이 있다면 알려주시면 감사드리겠습니다ㅠㅠ 바쁘실텐데 긴 글 읽어주셔서 감사합니다! 

2
도연김 프로필

JPA에서는 Insert into select는 사용할수 없는건가요? 도연김 1일 전
안녕하세요 강사님 jpa 강의를 들으면서 insert into select을 하고 싶은데,  구글링을 해도 정보가 없는데,  jpa에서는 무조건 insert만 할수 있는 건가요 ?

1
Chung A 프로필

내부 클래스가 많은 경우의 Response에서 DTO클래스 생성에 관하여 질문드립니다. Chung A 2일 전
안녕하세요 강사님 강의 너무 잘 듣고 있습니다ㅎㅎ 강의 내용을 실무에 적용하다가 DTO클래스에 관하여 질문이 생겨 글을 남깁니다. 다름이 아니라 강의처럼 모든 요청마다 ResponseDTO를 따로 만들려고 하다보니 생긴 문제인데  제 프로젝트의 경우, 한 엔티티가 연관관계를 가진 엔티티가 좀 많습니다. 그렇다보니 DTO를 반환할 때 내부 클래스들이 많아지는데 모든 내부 DTO클래스들을 적다 보니 너무 길어지는데요, //어노테이션 생략 public static class DTO_A{ ...변수 생략 DTO_B b; public static class b{ ...변수생략 List<DTO_C> list; public static class DTO_C{ //...변수 생략 } } }  (예를 들면 이런식입니다.) 이런식으로 한 클래스 안에 속한 내부 클래스가 많아  DTO 내용이 너무 방대한 경우(각 변수들이 필요하다고 가정하고 ) 코드 량이 너무 길어져서 작성 및 유지보수가 힘들것 같은데 이 경우에는 어떻게 하면 좋을지에 대한 강사님의 생각을 여쭤보고 싶어서 질문드립니다. 감사합니다! 

1
m s 프로필

@Transactional의 범위 m s 3일 전
여기서 =======의 사이에 select 쿼리가 나가야 할것 같은데 안나가네요... memberService.update 메소드 호출해서 update 메소드의 @Transactional로 트랜잭션이 시작하고 메소드가 종료되면 트랜잭션이 끝나서 영속성 컨텍스트가 사라지는거 아닌가요?? 그렇다면 memberService.findOne 메소드를 호출시 영속성 컨테스트는 아무것도 없으니 select 쿼리 날려서 해당 엔티티를 영속화 시켜야 하는거 아닌가요?

1
E mergency 프로필

NativeSQL 작성 질문 있습니다 E mergency 6일 전
현업에서는 어떤식으로 NativeSQL을 작성하는지 궁금해서 질문드립니다 권장 순서 부분에서 엔티티 조회나 DTO조회 방식이 안될때 NativeSQL이나 스프링 JdbcTemplate을 사용한다고 하셨는데 그정도면 굉장히 복잡한 쿼리라고 생각이 듭니다 그렇다면 이러한 쿼리는 일반적으로 개발자가 직접 작성하는지 아니면 DBA의 도움을 받아서 작성하는지 궁금합니다

2
mailislove 프로필

orderRepository.findAll() 에서 no arguments 오류 메세지 mailislove 8일 전
안녕하십니까? 1편에 이어 2편을 듣고 있는데 OrderSimpleApiController.java에서 @GetMapping("/api/v1/simple-orders")public List<Order> ordersV1() { List<Order> all = orderRepository.findAll(); 위 부분중 findAll()에 argument가 없다고 합니다 오류 메세지: java: method findAll in class jpabook.jpashop.repository.OrderRepository cannot be applied to given types;   required: jpabook.jpashop.domain.OrderSearch   found: no arguments   reason: actual and formal argument lists differ in length 기존 OrderRepository에는 아래와 같이  arguement 있는 것은 있는데 public List<Order> findAll(OrderSearch orderSearch) arguement 가 없는 것이 있어서 그런 것 같습니다. OrderReposotory에 아래와 같이 생성하면 되는가요? public List<Order> findAll() { return em.createQuery("select o from Order o", Order.class) .getResultList(); } 수행은 되는데 맞는지 몰라 문의 드립니다. 개발자는 아니라 따라 하며 이해 하는 것이라 조금 늦네요 ㅎㅎㅎ

1
BeomJun Lee 프로필

querydsl gradle추가 오류입니다ㅜ BeomJun Lee 11일 전
안녕하세요 선생님 애먹는게 있어서 질문드립니다! querydsl gradle에 관한 오류인데 오류에 대한 최근 질문을 찾아봤더니 이러한 해결책이 나오더라구요 https://www.inflearn.com/questions/23530 그래서 위 내용처럼 설정하고 querydsl컴파일도 받고 코드작성후 실행하니까 이런 오류가 뜹니다.. 계속 찾아봐도 해결이 안돼서 질문드립니다ㅜ 완강하고 자려고했는데 자고일어나서 해야겠습니다...(gradle 7.0오류는 처음부터 있었고 빨간 Note라고 적혀있는건 springboot를 run하면 나왔습니다)

3
김필환 프로필

OSIV와 성능 최적화 질문 김필환 12일 전
강의를 들으면서 갑자기 생각난 질문입니다.만약 osiv off 상태의 프로젝트에서, Filter 나 Interceptor 단에서 JPA 접근이 필요한 경우는 보통 어떻게 처리 하나요?? 수동으로 영속성 컨텍스트를 오픈? 아니면 @transactional 지정? 아니면 다른 방법??실 사례에서는 어떻게 해결하는지 궁금합니다.

1
개발자 프로필

조회 v3.1에서 to One 관계는 모두 페치 조인하고 나머지 컬렉션은 지연로딩을 유지했을때 다음과 같은 에러가 발생합니다. 개발자 15일 전
좋은 강의 감사합니다. 조회  v3.1에서 to One 관계는 모두 페치 조인하고 나머지 컬렉션은 지연로딩을 유지했을때 다음과 같은 에러가 발생합니다. query specified join fetching, but the owner of the fetched association was not present in the select list 고심하던 중 @Query부분을 value 와 countQuery로 나눠어서 처리 한 결과 정상적으로 조회 됬습니다.(Spring Data Jpa사용) 예)     @Query(value = "select u from User u join fetch u.store s",             countQuery = "select count(u) from User u")     Page<User> findAllUser(Pageable pageable); 꼭 countQuery를 사용해야 하는지 궁금합니다.

2
개발자 프로필

강의 내용중 Controller class에 Inner Class형태로 Dto로 정의 되어 있습니다. 개발자 16일 전
좋은 강의 감사합니다. 강의 내용중 Controller class에 Inner Class형태로 Dto로 정의 되어 있습니다. Dto를 분리하지 않고 Inner Class로 처리 한 이유가 강의 편의상 인지 프로젝트 구조상 이점이 있어서 인지 궁금합니다.

2
남기석 프로필

안녕하세요 남기석 19일 전
안녕하세요 강사님. 복습을 하면서 궁금한점이 생겨서 질문을 남깁니다. 예제에서는 아이템을 하나만 선택하고 RequestParam으로 아이템id를 하나만 받는데 여러 아이템을 선택할 땐 어떤방법을 사용하는지 여쭤보고 싶습니다. 타임리프에 대해서도 검색을 해보는데 정확히 어떤내용을 찾아야할지 감이없어서 어렵네요.

1
정재훈 프로필

fetch 전략 동적 선택 정재훈 20일 전
@ManyToOne 관계나 @OneToMany 관계에서 fetch 전략을 동적으로 결정할 수 는 없을까요.. 일을하다 보면 상황에 따라서  lazy, eager 가 달라지는데  특정 메소드를 호출할때 fetch 전략을 lazy 로 할지 eager 로 할지 결정할 수는 없나요?

2
kim 프로필

DB 운영에 관한 질문 드립니다 kim 21일 전
안녕하세요~ 오랜만에 질문드립니다 ^^제가 올해부터 dba역할을 맞게 되었는데요 고민이 생기어서 질문드립니다 1. erd관리를 혹시 하시나요? 현재 db는 postgresql을 사용하고 있습니다. erd를 볼 때 dbweaver튤이라는 것을 사용해서 erd를 보고 있는데 문제점은 관계가 펴시가 안됩니다. 왜냐하면 reference를 걸지않고서 사용하기 때문인데요. 혹시 erd관리를 어떻게 하시는지 궁금합니다. 관리하시면 어떤 툴을 사용하는지도 알려주시면 참고하겠습니다 2. 테이블과 테이블이 관계가 있을때 요즘은 성능상의 이슈로 foreign key를 걸지않고 테이블을 작성하시나요? postgresql에서는 reference로 거는데 전혀 reference가 걸려있지 않은 상태입니다

2
jeon9435 프로필

안녕하세요. Unique Index 데이터 저장에 대해서 질문드립니다. jeon9435 22일 전
안녕하세요. 강의 잘 듣고 많은걸 배우고 있습니다. 현재 강의와는 안 맞을 수 있는내용이지만.. 많은 고민이 되어 질문드립니다ㅜ 예를들어 Team이라는 테이블이 있고, name이라는 Column이 Unique Index로 설정되어 있는 상태입니다. CrudRepository의 save 함수를 이용해 저장하고 있고 Custom Exception을 핸들링해서 "이미 저장되어 있습니다."라는 응답값을 반환하는것이 목표입니다. 현재 고민하고 있는 방법은 1. Insert 쿼리를 사용하기전에 이미 저장된 name이 있는지 Select 쿼리로 조회해 있다면 Custom Exception을 발생. -> 팀을 생성할때마다 Select 쿼리를 발생 2.try ... catch로  DataIntegrityViolationException을 잡아 Custom Exception 발생 -> DataIntegrityViolationException이 넓은 범위의 제약조건을 포함하고 있는 것으로 알고있어서 DuplicateKey ErrorCode로 잡아서 Custom Exception을 발생시켜야하나 싶습니다.. 혹시 실무에서는 위의 방법 중 하나 혹은 다른 방법을 사용해 어떤식으로 해결하는지 궁금합니다

2
dev1 프로필

collect Mapping 오류 dev1 22일 전
컬렉션 최적화 - 주문조회v6 진행하고 있습니다. VS Code 로 따라하고 있어서 올려주신 코드를 복사하니 오류가 발생했습니다. collcect 에 대한 공부가 부족하여 오류가 발생하는데 고치지 못하고 있네요. 가르쳐주시면 감사하겠습니다. 1. toList() 에서 오류 발생 --> Collecotors.toList() 로 수정 2. (1)번으로 바꾸었더니 mapping 에서 오류 발생 각 상황에 대해 아래 사진 첨부합니다.

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스