묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
변경감지에 대해 질문 있습니다.
jpa를 이용해 게시판을 만들고 있는 중 입니다. 저는 repository 계층을 인터페이스에 JpaRepository를 상속해서 사용하고 있는데 수정 작업 시 영속이나 준영속 신경 안 쓰고 무조건 save로 데이터를 처리하는건 좋지않은 방법인가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Book 이외의 아이템 구현 질문입니다.
우선 강의 정말 유익했으며 친절한 답변도 항상 감사하고 있습니다~강의가 진심으로 재미있어요! 제가 강의를 마치고 이것저것 해보고 싶어서 시도중입니다.(JPA 기본강의 잘듣고있습니당)해보고싶은건 많지만 우선 Book 말고 Album과 Movie도 사용해보고 싶었습니다. 현재상황- Item 엔티티에 itemType 변수추가(어떤 item인지 식별하기 위해서)- Album,Movie의 Form객체,컨트롤러, 뷰(html)파일 등 생성-서비스는 따로 구현x ItemService만 사용 주문 목록에 올리는것까진 금방했는데 수정에서 좀 걸렸습니다. 삽질하다가 결국 생각해낸게 조금지저분하지만.. ItemType으로 어떤 아이템인지 if문으로 식별해서각 아이템에 맞는 수정페이지를 매핑하는 방법으로 했습니다. updateItem 메서드에서 파라미터로 받기위한 ItemForm 객체를 하나 만들어서 업데이트 했습니다.--------------- ItemController package jpabook.jpashop.controller;import jpabook.jpashop.domain.item.Album;import jpabook.jpashop.domain.item.Book;import jpabook.jpashop.domain.item.Item;import jpabook.jpashop.service.ItemService;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import java.util.List;@Controller@RequiredArgsConstructorpublic class ItemController { private final ItemService itemService; // 아이템 선택 페이지로 매핑 @GetMapping("/items/new") public String createForm(Model model) { //model.addAttribute("form", new BookForm()); return "items/createItemFormAll"; } // Book 클릭시 등록 페이지로 매핑 @GetMapping("/items/createItemForm") public String CreateBook(Model model){ model.addAttribute("form", new BookForm()); return "items/createItemForm"; } // 등록 페이지에서 버튼 클릭시 Book 생성 후 목록화면으로 매핑 @PostMapping("items/new/Book") public String create(BookForm form) { Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); book.setItemType("Book"); itemService.saveItem(book); return "redirect:/items"; } // 상품 목록 클릭시 리스트 화면으로 매핑 @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "items/itemList"; } //상품 수정 화면 렌더링 @GetMapping("items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Item item = itemService.findOne(itemId); if(item.getItemType() == "Book"){ BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); model.addAttribute("form", form); return "items/updateItemForm"; }else if(item.getItemType() == "Movie"){ MovieForm form = new MovieForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); model.addAttribute("form", form); return "items/updateItemFormMovie"; }else if(item.getItemType() == "Album"){ AlbumForm form = new AlbumForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); model.addAttribute("form", form); return "items/updateItemFormAlbum"; }else { //에러처리.. } return null; } //상품 수정 @PostMapping("items/{itemId}/edit") public String updateItem(@ModelAttribute("form") ItemForm form) { itemService.updateItem(form.getId(), form.getName(), form.getPrice(), form.getStockQuantity()); return "redirect:/items"; }} --------------- ItemForm package jpabook.jpashop.controller;import lombok.Getter;import lombok.Setter;@Getter @Setterpublic class ItemForm { private Long id; private String name; private int price; private int stockQuantity;} 문제는 ItemForm을 이용하다보니 각 아이템의 고유필드값(Book-isbn,author Movie-director,actor 등)을 수정 못합니다.Category객체를 이용해야 되나 싶었는데 손을 못대겠더라구요ㅠ 결국 제가 궁금한것은 이거입니다.실무에선 어떤 방식으로 여러 item들을 사용하나요??어떤식으로 코드를 짜야하는지 궁급합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
findOne과 findByName 의 차이에 대해
안녕하세요 강사님. 다름아니라 제가 JPA 기초를 듣지않고 바로 실습으로 와서 그런지 몰라도 entityManager의 기능 중 find 는 id 로만 조회가 가능하고 나머지 프로퍼티( 예 : name ) 으로 조회할 때는 쿼리를 날려서 조회해야하는 건가요? 그리고 쿼리로 조회하면 건 수가 1개이더라도 무조건 List로 반환되는 건가요 ??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ArrayJson의 dto 관련
안녕하세요! 이번에 처음으로 jpa를 사용해서 토이프로젝트를 하고있습니다. 질문에 앞서서 이런 강의 만들어주셔서 너무 감사합니다 한눈에 쏙들어오고 이해가 됩니다 ㅎㅎ 제가 드릴 질문은 json방식이 Array방식일경우 dto에 자동으로 맵핑이 안되더라구요...어떤방식으로 해야자동맵핑이 될지 궁굼합니다.
-
해결됨실전! 스프링 데이터 JPA
강사님 락관련 질문있습니다.
강사님 안녕하세요! 강의 잘 보고 있습니다. 실무에서 애플리케이션에서 데이터를 DB로 저장할때 애플리케이션을 사용하는 사용자가 정해져 있기 때문에 딱히 락에 대해서 고민해 본적이 없었습니다. 그러다가 강의를 보면서 문득 든 생각이 인기있는 쇼핑몰에서 트래픽이 몰려서 특정 상품 구입에 여러명이 동시에 구매 버튼을 눌렀을 때 재고 수를 맞추기 위해서 왠지 락이 필요할 것 같다는 생각이 문득 들었습니다. 하지만 락을 사용하면 성능 이슈가 발생한다고 하셨는데, 그렇지만 재고를 정확하게 관리하려면 필요할 것 같기도 하다는 생각이 들었지만 제기준에서는 실무에서는 트랜잭션도 READ_COMMIT레벨에서만 사용했기 때문에 감이 잘 오지는 않습니다. 혹시 락이 적용된 사례를 한두가지 알려주실 수 없을까요? 엉뚱한 질문이지만 답변해주시면 감사하겠습니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요. 다대다 관계에서 질문 있습니다.
안녕하세요. 예제에서는 Category에 JoinTable을 설정하고 Item에는 mapped by를 설정해주셨는데요. 그러니까 Category를 연관관계 주인으로 잡아주셨는데, 이거는 혹시 꼭 Category로 잡은 기준이 있는 걸까요?
-
미해결스프링 핵심 원리 - 기본편
provider 관련 궁금증이 있습니다.
logic() 메서드 호출 시 그때 마다 프로토타입 빈이 생성되어 사용이 되는데 해당 코드를 보면 provider.get() 입니다. 이 경우에는 new PrototypeBean(); 을 호출하는 것과 다른 점이 있을까요? ObjectProvider 같은 경우에는 이외 많은 기능이 있어 사용 하는것이 수긍이 가나 단순히 빈을 해당 라인에서 생성하는 것은 생성자를 호출하는것과 동일한데 provider.get() 코드와 new PrototypeBean(); 코드가 다른점이 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
영상 11:00 ~ 11:30 내용 질문입니다.
OrderRepository에 직접 접근해서 findAll을 호출해서 DTO 객체를 만드는데요. 이메서드에는 @Transactional이 안붙어있어서 엔티티매니저가 메서드 호출이 완료되더라도 1차캐시가 끝나지않고 유지되는데 문제는 @Transactional를 붙일경우 메서드 호출이 끝나면 엔티티 매니저도 같이 종료시켜버리지만, 이 코드에서는 컨트롤러에서 엔티티 매니저를 close()를 명시적으로 호출하지 않는데 이럴경우 문제 없을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
헉 앱개발 면접 때...
질문은 아니지만..정말강의쏙쏙입니다 감사합니다
-
해결됨스프링 데이터 JPA
findById() 메소드 관련 질문입니다.
기선님의 jpa 강의를 듣고 jpa 를 활용해보기 위한 연습용 프로젝트를 진행하고 있는 중입니다. DB에 데이터가 들어가 있는 상태에서 스프링 데이터 jpa 의 findById() 메소드를 활용해 select 쿼리를 보내봤습니다. 그런데 이상하게도 값이 받아와지지 않아 두번 연속 요청을 보냈더니 그 다음부터는 값을 받아오는데 이게 가능한 일인지 궁금해서 여쭤봅니다 .. 기본적으로 이런 일은 발생하지 않는게 맞고 어디선가 제가 코드를 잘못 작성해놓은거겠죠..? orderDetailRepository 에 findById() 를 재정의 하거나 다른 메서드를 구현해놓지도 않은 상태입니다 .
-
미해결스프링 핵심 원리 - 기본편
안녕하세요, 선생님. 몇 가지 질문 여쭙겠습니다.
안녕하세요, 김영한 선생님? 강의 내용 중 궁금한 부분이 생겨 질문 드립니다. 첫 째로, DiscountService 라는 static class에서, `private final Map<String, DiscountPolicy> policyMap;` 의 Autowired가 동작하는 방식이 Map<String, DiscountPolicy> 라는 데이터 타입을 보고, 스프링이 "아, Map이니까 이에 걸맞게 넣어줘야 하는구나" 라고 인식해서 주입해주는 것인가요? 바꿔 말하면, List, Map 이외에 다른 컬렉션에서도 모두 사용될 수 있나요? 혹은 더 나아가서, 커스텀 클래스에도 사용할 수 있나요? 그 범위가 어디까지인지, 동작 방식이 궁금합니다. 두 번째로, pdf 강의자료 중, "로직 분석" 의, 'discount() 메서드는 discountCode 로..' 부분에서, rateDiscountPolicy가 넘어오면 fixDiscountPolicy 스프링 빈을 찾아서 실행한다고 작성되어 있는데, 이는 rateDiscountPolicy의 오타인가요? 마지막으로, 조금 다른 이야기인데, 11월 중에 출시하실 스프링 웹 MVC의 구체적인 날짜를 혹시 알 수 있을까요? 너무 기대되는 강의라 하루 빨리 듣고싶습니다. :) 항상 강의 잘 보고 있습니다. 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
Spring의 Bean주입 관련 질문입니다
안녕하세요 영한님 이번 강의를 듣고 궁금증이 생겨 이렇게 질문드립니다. 1. 첫번째 질문입니다. 평소에 의존성 주입을 할때 의존성을 주입할 객체를 private final로 선언한후에 Lombok의 @RequiredArgsConstructor를 사용하거나 final로 선언된 객체를 생성자를 통하여 받아 주입을 하였습니다. 근데 강의를 듣다보니 영한님같은 경우는 @Autowired를 생성자에 사용하고 계신데 로그상으로 봣을때는 @Autowired가 있고 없고가 차이가 없어 보입니다. 혹시 @Autowired의 사용 유무에 따라서 내부적으로 차이점이 있는건가요? 2. 두번째 질문은 14:40 구간에 스프링 빈저장소 그림을 보다가 문득 생각났는데요 Bean객체가 빈 저장소에 등록되는 순서가 존재하는 걸까요? MemberService의 경우는 MemberRepository의 의존성을 주입 받아야하는데 MemberService가 먼저 빈저장소에 등록되고 이후에 MemberRepository에 등록되는 경우는 MemberService가 생성될때 MemberRepository의 빈정보는 빈 저장소에 없는 상태인데 이럴경우는 어떻게 해당 객체를 생성자를 통하여 주입후 MemberService가 생성되는지 궁금해졌습니다. 그래서 제가 스스로 생각해본 내용은 전체의 빈을 먼저 스캔한후 주입받을 내용이없는 빈을 먼저 빈저장소에 등록후 이후에 주입받을 빈이 있는 객체를 생성하여 빈저장소에 저장한다. 라고 생각도 해보았는데 로그상으로 보면 Creating shared instance of singleton bean 'AClass' Creating shared instance of singleton bean 'BClass' Autowiring by type from bean name 'AClass' via constructor to bean named 'BClass' 이 순서대로 빈이 생성되어 주입되는듯하네요 그래서 또 다른 생각은 SpringMVC같은 경우는 컨트롤러에서 요청된 내용을 reflection을 통하여 해당하는 요청의 메소드를 invoke시키는 것으로 배웠는데 그렇다면 빈들을 먼저 빈 저장소에 저장후에 그 이후에 저장된 빈에서 주입이 안된 객체를 찾아 꺼내고 reflection을 통하여 생성자의 파라미터에 주어진 객체를 저장해줄까 라는 생각도 해보았습니다. 스프링에서는 내부적으로 빈이 어떻게 주입이 되는지가 궁금합니다. ㅎㅎ!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
기본키 매핑 전략을 AUTO에서 IDENTITY로 변경 시 고려사항
안녕하세요. 기본키 매핑 전략을 AUTO에서 IDENTITY로 변경 시 고려해야하는 부분들에 대해 조언을 얻고자 질문드립니다. 현재 저는 MariaDB 10.3.11 version을 사용중이며 엔티티 클래스 개발시 LONG 타입 PK에 기본키 전략을 AUTO로 해왔습니다.서비스를 오픈 후, 개선 사항들을 확인해보던 중 기본키 전략이 TABLE전략으로 되어있더라구요.(hibernate_sequence 테이블이 생성되어있고 엔티티 수만큼 next_val row가 있으면 TABLE 전략이겠지요..?) 성능 문제 및 여러 이유때문에 모든 엔티티 클래스를 AUTO에서 IDENTITY 전략으로 변경하려 합니다. 그러기 위해, 엔티티 클래스 ID 필드를 IDENTITY로 바꾸고 DB 모든 테이블에 Auto Incerement 속성을 부여하고, 개발 서버에서 테스트한 결과 지금까지는 큰 문제를 발견하지 못했습니다. Id 값이나 필드 속성이 아닌 바꾸는 것이 아니라 크게 문제는 없을 것 같긴해서운영 환경에서도 변경을 하려는데 지금까지 너무 수월하게(?) 변경이 되어서 좀 걱정이 되더라구요. 그래서 강사님께 엔티티 ID 매핑 전략 변경 시 추가적으로 고려해야하는 부분이 있는지 여쭤보고자 이렇게 질문을 드립니다. 감사합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
SpringConfig
@Autowired지우고 SpringConfig 파일 생성 후 실행해보니 bean이 이미 정의 되어 있다는 식의 오류가 떴습니다. 구글링 해보니 spring boot 2.1 이후로는 bean을 overriding 못하도록 설정되어있다고 하더라고요. application.properties 파일에 spring.main.allow-bean-definition-overriding=true 를 추가하니 작동하긴 하는데, 빈이 오버라이드 될 경우에 무슨 문제점이 발생하나요? 뭔가 문제점이 있으니까 스프링에서 디폴트 설정을 바꾼 것 같은데... 구글링 해도 해결법만 나오고 왜 그런지는 설명이 없네요ㅜㅜ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
final 질문
15:21 쯤에 MemberRepository를 밖에서 넣어줄 수 있도록 메소드를 하나 생성했는데 똑같은 코드인데 오류가 나네요ㅠㅠ The final field MemberService.memberRepository cannot be assigned final 키워드를 없애면 잘 돌아가긴 하는데 문제가 생기진 않을까요?
-
해결됨스프링 핵심 원리 - 기본편
도메인에 대해서..
"도메인", "도메인모델"이라는 "뜻"과 "설명"이 저에게 아직 와 닫지 않아서 질문드릴게 있는데요!! 제가 이해한 도메인은... 예를들어 회원가입 이라는 소프트웨어를 만든다고 하면 가입, 수정, 탈퇴 등 단위적인 부분들을 도메인이라 부르고, 도메인 모델은... 가입, 수정, 탈퇴 등 기능과 데이터를 함꼐 보여주는 클래스 다이어그램으로 표현하는 부분들이 도메인 모델이라 부르나요? 자세한 설명 부탁드립니다.
-
미해결스프링 핵심 원리 - 기본편
영상 초반에 OrderApp 및 테스트 부분에서 질문 있습니다.
초반에 OrderApp (및 테스트) 에서 궁금한게 있습니다. 1) MemberService의 구현체인 MemberServiceImpl 안의 MemberRepository 2) OrderService의 구현체인 OrderServiceImpl 안의 MemberRepository 1),2) 각각 다른 인스턴스의 MemberRepository를 가지는게 아닌가요? (new 연산으로 인해) memberService.join(member)는 1)의 MemberRepository에 save되는 거고, orderService.createOrder.createOrder()는 2)의 MemberRepository에서 member를 꺼내오는건데, member가 없으므로 npe가 나야하는게 아닌가 싶어서요! (제가 강의 중간에 놓친게 있는건가요 ㅠㅠ)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강사님 파라미터에서 데이터 받는것에 질문 드립니다.
updateItemForm 메소드에서 강사님은 modelattribute로 데이터를 받으셨는데, modelattribute를 안쓰고 그냥 BookForm form으로 데이터를 받아도 잘 수정이되더라구요. 1.modelattribute를 쓰신 이유가 궁금하며, 2. 파라미터로 데이터를 매칭할때 modelattribute를 쓰지 않는 상황에서 파라미터 변수가 form이라는 이름 때문에 매칭되는건지, 아님 Bookform이라는 객체타입를 인식해서 알아서 매핑되는건지 궁금합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Long과 long의 차이는 무엇이고 왜 Long을 쓰신건가요?
Member클래스의 id 타입과 MemberRepository 인터페이스에 존재하는 findById의 id를 모두 Long으로 작성하셨는데 왜 long을 안쓰시고 Long을 쓰셨는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
private final 에서 final의 역할...
안녕하세요. 제목과 같습니다. final의 역할이 궁금합니다!