묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
updateitem dto관련
UpdateItemDto dto이렇게만들어서 사용해도된다고해서 만들어볼려고한느데 ItemService 에 @Transactional public void updateItem(Long itemId, UpdateItemDto dto) { Item findItem = itemRepository.findOne(itemId); findItem.setPrice(dto.getPrice()); findItem.setName(dto.getName()); findItem.setStockQuantity(dto.getStockQuantity()); } 이렇게 만들고 UpdateItemDto @Getter @Setter public class UpdateItemDto { private String name; private int price; private int stockQuantity; } 이렇게만들고 근데 controller에서 @PostMapping("items/{itemid}/edit") public String updateItem(@PathVariable Long itemId, @ModelAttribute("form") BookForm form) { itemService.updateItem(itemId, form); return "redirect:/items"; 이런식으로되어있는데 form을어떻게dto로넘길수있을까요 controller에서 dto로넘기는건 안좋다고 다른질문에서본거같은데
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티에 로직들질문
서비스에 하는게 더 로직에맞는거아닌가해서요 물론간단한예제라서 엔티티에하는건지 아니면원래 엔티티에해도되는건지를모르겠습니다. 엔티티에 메서드를 많이만드는게 신기하다고해야되나 다른곳에서도 이렇게해도되는건지가궁금합니다.
-
미해결실전! 스프링 데이터 JPA
엔티티, DTO 유효성 검사에 대해 질문 드립니다.
엔티티, DTO를 둘 다 유효성 검사를 하나요? 만약 엔티티도 유효성 검사를 할 떄 Bean validation을 사용하시나요?
-
미해결스프링 시큐리티
@EnableGlobalAuthentication 관련 질문입니다.
@EnableWebSecurity 어노테이션 안에 @Configuration 어노테이션이 포함되어 있는데 그러면@EnableWebSecurity이 있는 클래스에 @Configuration 를 안붙여도 괜찮을까요?
-
해결됨스프링과 JPA 기반 웹 애플리케이션 개발
지원중단
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. public class SecurityConfig extends WebSecurityConfigurerAdapter 에서 WebSecurityConfigurerAdapter 이게 지원중단이라떠서 더이상 진행이 불가능한데 어떻게 해결할 수 있나요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
질문 있습니다.
코틀린에서는 null 사용을 안전하게 하기 위해서 null 이 들어갈 수 있는 변수를 완전히 다른 타입으로 간주하고 아래와 같이 효과적으로 관리할 수 있다. 라고 말씀해주셨는데요 그렇다면 String과 String? 타입은 엄연히 다른 타입 인것이고 String? 이 자체를 하나의 타입으로 간주해야하는건가요? String? 이렇게 생긴 타입은 코틀린에서는 클래스로 정의 되어 있지 않아서요..!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberForm부분 질문
@PostMapping("/members/new") public String create(MemberForm form) { Member member = new Member(); member.setName(form.getName()); memberService.join(member); return "redirect:/"; } 에서 MemberForm.java를만들면 form에서 입력된 name이 memberForm으로들어간다고하더라고요 근데 어떻게 form에서 입력된값이 바로 MemberForm.java로 들어갌수있는지 이해가 안가는데 원래 파라미터 받아서 setName해서 memberform안에 name를 저장해야되는거 아닌가요? 단순히 form에서 값입력후 전송했는데 MemberForm 으로 넘어가는걸 모르겠습니다. 그러니 위에 바로 form.getName()이렇게 바로 불러올수있는게 이해가 안가는데 어떻게 가능한걸까요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello.html에 data
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 왜 data에 빨간줄이 뜰까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order 도메인 this.member 부분 에러
강의 내용중, Order 도메인을 작성할때 다음 스크린샷처럼 Member, Delivery 엔티티를 사용하여 this 키워드를 사용할때 Cannot access jpabook.jpashop.domain.Member 에러가 나고 있습니다. Member와 Delivery, Order 는 모두 예시로 올려주신 코드와 확인하여 똑같이 작성한걸 확인했지만 혹시 몰라 제가 작성한 코드를 같이 올리겠습니다. package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class Delivery { @Id @GeneratedValue @Column(name = "delivery_id") private Long id; @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY) private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus deliveryStatus; } package jpabook.jpashop.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import static javax.persistence.FetchType.*; @Entity @Table(name="orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) // 이거는 한 도메인 안에서 생성 메서드 등을 통해 로직을 구현했을 경우에 // 접근을 막기위해 사용한다 // 누구는 여기 만들어진 createOrder 를 통해서 주문을 생성하고 // 누구는 Order order = new Order -> order.setOrder로 생성하고 하면 나중에 골치아파치므로 // 애초에 public 으로 지정되어 있지 않은거 + 롬복통한 getter setter 를 통한 코딩을 막아준다 public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne (fetch = LAZY) @JoinColumn(name="member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) // cascade all 걸어주면 private List<OrderItem> orderItems = new ArrayList<>(); // persist(orderItemA) // persist(orderItemB) // persist(orderItemC) // persist(order) 를 cascase all 안걸어주면 이렇게 넣어야하는데 // 걸어주면 persist(order)하면 자동적으로 다 넣어줌 딜리트도 마찬가지로 다 같이 지워줌 // 즉, 원래는 order 에 들어가는 delivery 나 orderItems 등은 다른 테이블에 같이 걸려있잖아 그걸 // 일일히 다 테이블마다 찾아가서 넣어줘야하는데 cascade all 걸어주면 알아서 그걸 다 연동해서 cd 해줌 @OneToOne (fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name="delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; // 주문상태 order cancel //연관관계 편의 메서드 = 양방향일때 쓰면 편한 메소드 //이게 뭐냐면 연관관계 맺어줬으면 DB딴에서는 이런거 안해줘도 다 알아서 동작하긴 하는데 // 비지니스 로직상에서는 이렇게 set할수 있는 연관관계 메서드가 있어야 구현할때 편함 public void setMember(Member member){ this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery){ this.delivery=delivery; delivery.setOrder(this); } //연관관계 메서드 위치는 컨트롤하는쪽에 위치하는게 좋음 비지니스 로직에 의하면 // public static void main (String[] args){ // Member m = new Member(); // Order o = new Order(); // // m.getOrders().add(o); --> 이거 할필요가 없어짐 // o.setMember(m); // } // 원래는 연관관계 메서드가 없으면 이렇게 일일히 비지니스 로직딴에서 데이터 객체 생성후 member 에도 넣어주고 order 에도 넣어주고 해야하는데 // 연관관계 메서드를 만들어 놓으면 로직딴에서 저짓할필요가 없이 편해짐 // ... 은 가변파라미터, String 이라 치면 몇개를 넣어도 다 카바 가능 -> list = 가변파라미터 하면 다 리스트에 들어감 차곡차곡 //생성메서드 public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem:orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //비지니스 로직 //주문취소 public void cancel(){ if(delivery.getDeliveryStatus()==DeliveryStatus.COMP){ throw new IllegalStateException("배송 완료된 상품은 취소불가"); } this.setStatus(OrderStatus.CANCEL); for(OrderItem orderItem:orderItems){ orderItem.cancel(); } } //전체주문가격 조회 public int getTotalPrice(){ int totalprice = 0; for(OrderItem orderItem:orderitems){ totalprice += orderItem.getTotalPrice(); } return totalprice; } } import 구문을 직접 작성하여 엔티티들을 직접 임포트까지 해보고, 로직상에서 아예 jpabook.jpashop.~~ 처럼 직접 임포트 구문을 작성해서 시도도 해보았지만 해결이 되지 않아 질문을 올리게 되었습니다. 확인부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Data v2
v1에서 CreateMemberResponse는 final 키워드, @NotNull이 모두 없으므로 id를 받는 생성자를 새로 생성해주었습니다. v2인 CreateMemberRequest에서도 final 키워드, @NotNull이 모두 없으므로 id를 받는 생성자를 만들어 주어야 할 것 같은데 이 경우 생성 안해준 이유가 궁금합니다. @Datastatic class CreateMemberRequest{ @NotEmpty private String name;}
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
3. 클래스를 상속받을 때 주의할점 질문
그 Base 와 Derived를 설명 해 주실 때 1. 상위 클래스 생성자가 실행되는 동안 하위 클래스의 프로퍼티 즉 Derived를 인스턴스화 한다는 말은 2. Derived에 있는 number에 값을 집어 넣어준다는 건데 3. 이때 상위 클래스에서 넘버를 호출하게 되면 하위 클래스에 있는 넘버를 가져오잖아요 4. 근데 아직 상위 클래스의 constructor가 먼저 실행된 단계라서 하위 클래스에 number 라는 값에 초기화가 이루어지지 않아서 0 이 나오는 거에요. (3.)을 삽질을 조금 해가며 찾아봤었는데, 제가 이해했는게 맞는지 질문드립니다. "open 된 부모 클래스의 필드는 사용자가 지정한 값을 무시하고, 기본 값을 할당한다. 이후 자식 클래스에서 같은 이름의 필드를 만들어 사용한다. (쉐도잉)" 그래서 부모 클래스 Base init {..} 안에 open 필드를 사용하면 기본값이 나온다고 이해 했습니다. 제가 이해한 내용이 맞을까요? - - <장문 주의> - - 이런 결론을 내게된 과정은 아래와 같습니다. 자바로 디컴파일을 해보니, 코틀린은 생성자를 여러 개를 역할 나눠 순서대로 사용하더라구요. 1, (기본 값) (사용여부를 나타내는 이진수) (기본생성자 마커)각 매개변수에 넣을 기본 값을 지정. var 로 선언하더라도 동일 public Base() { this(0, 0, 0, 0, 0, 31, (DefaultConstructorMarker)null);} 2. (사용여부를 나타내는 이진수)를 바탕으로 초기화를 하는 생성자 예) 총 5개중에 첫번째, 세번째 변수 사용 => 10100 public Base(int var1, int var2, int var3, int var4, int var5, int var6, DefaultConstructorMarker var7) { // 매개 변수를 5개를 사용해서, 6번째에 사용여부 이진수를 넣음 if ((var6 & 1) != 0) { var1 = 100; } if ((var6 & 2) != 0) { var2 = -1; } if ((var6 & 4) != 0) { var3 = -11; } if ((var6 & 8) != 0) { var4 = -22; } if ((var6 & 16) != 0) { var5 = -33; } this(var1, var2, var3, var4, var5) 3. 일반적인 생성자 코드와 init {...} 안의 내용 public Base(int number, int base, int hoho, int hihi, int hehe) { this.number = number; this.base = base; this.hoho = hoho; this.hihi = hihi; this.hehe = hehe; String var6 = "Base Class " + this.base; System.out.println(var6); var6 = "B " + this.getNumber(); System.out.println(var6);} 즉 Base 부모 클래스에는 open 한 변수들은 바로 위에 적힌 (3. 생성자)를 통해 기본값이 할당된 상태로 그냥 존재하더라구요. public class Base { private final int number; // open 한 매개변수 private final int base; // open 한 매개변수 private final int hoho; private final int hihi; private final int hehe; 이후 Derived 자식 클래스에 의해 부모 클래스의 매개변수들이 가려졌었습니다. public final class Derived extends Base { private final int number; private final int derived; 자식 클래스의 초기화 여부와 상관없이 부모클래스 안에서, 부모 필드를 호출했으니 0이 나오게 되는 거더라구요. 이후 자식 객체에서 같은 이름으로 쉐도잉 되는데, 가려졌을 뿐 힙 메모리 상에는 부모클래스의 필드는 그대로 0 이구요. 제가 이해한 내용이 맞을까요? ---------------- 혹시 getter 로 접근하는 것과 필드에 직접 접근하는 거에 차이가 있는건가 싶어서, 그것도 확인해보았는데 - 내부에서만 사용하는 경우 getter로 접근하지 않고 직접 필드 접근으로 최적화 되었습니다. String var3 = "Derived Class " + this.derived;System.out.println(var3); - open 을 사용하거나 override된 필드는 getter로 접근하더라구요. var3 = "D " + this.getNumber();System.out.println(var3); 근데 최적화의 차이만 있을 뿐, this.number 로 변경되더라도 결과는 다르지 않을 듯 합니다. Base init{..} 은 어차피 부모 필드를 호출하게 되니까요.
-
미해결Do it! 자바 프로그래밍 입문 with 은종쌤
인터페이스를 상속받을 수도 있나요 ?
상속도 하고 인터페이스도 만드는 걸 보다보니 헷갈려서 그러는데요. 인터페이스를 만들고 그 인터페이스를 extends해서 구현하는 건가요 ? 구현을 하려면 extends하고 그 인터페이스를 쓰려면 implements 하는건가요 ? 인터페이스를 extends하고 implements하기도 하는 것같은데 두개의 차이를 잘 모르겠습니다. package interfaceex; public interface MyInterface extends X,Y{ void myMethod(); } 강의에서 X,Y는 인터페이스인데 X,Y를 상속 하는 것부터 이해가 안가네요... implements 해야하지않나요 ?
-
미해결Do it! 자바 프로그래밍 입문 with 은종쌤
영상 8:!5 ~ for (int i: arr)
: 이 기호가 무슨 뜻인지 모르겠어요 static int total (int[] arr){ int total = 0; for(int i :arr){ total += 1; } return total ; }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
경로 질문드립니다.
안녕하세요. @GetMapping("/hello") public void hello(Model model){ model.addAttribute("data", "hello!"); } 웹 브라우저에서 hello 경로로 접근할 때 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버가 화면을 찾아서 처리한다고 하셨는데 return 반환값이 없는 void로 해도 접근이 가능해서요. hello 경로에 접근하면 스프링 내부에서 resources -> static -> templates 순서대로 hello.html이 있는지 확인하는게 아닌가 싶어서 질문드립니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@JoinColumn 애노테이션 질문 있습니다.
[질문 내용]@JoinColumn 애노테이션을 사용하는 이유가 회원 엔티티의 Team이랑 회원 테이블의 FK(TEAM_ID)를 서로 매핑해줘야 회원 테이블의 외래키(TEAM_ID)를 통해서 Team을 가지고 올 수 있기 때문이라고 생각하면 될까요? 잘 와닿지가 않아서 질문 남깁니다. Team과 외래키를 매핑한다는 게 구체적으로 무슨 의미인지 잘 모르겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서 OrderItem접근
OrderService에서 OrderItem접근이 어떻게 가능한지 궁금합니다. OrderService @Transactionalpublic Long order(Long memberId, Long itemId, int count) { // memberId를 가져오기 위해선 MemberRepository있어야 함 //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); //배송정보 생성(회원정보 Address) Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); //주문상품 생성 OrderItem.createOrderItem() // [질문한 부분]} 혹시 어떠한 도메인 이든 , Controller, Service, Repository에 접근 가능해서 그런걸까요?!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
파라미터 ...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Order에 생성 메서드를 구현할때 파라미터에 ... 넣는 의미를 모르겠습니다. 어느 경우에 사용하나요? public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Mysql 인메모리DB 설정, 로그 쿼리남기기
안녕하세요, 저는 처음부터 H2데이터베이스가 아닌 MySQL을 연결해서 사용하고 있습니다. 테스트 코드 작성 후 여러 이점으로 메모리디비 연결 하는 방법을 알려주셨는데, Mysql의 경우도 할 수 있나요? 현재 dependencies에 implementation 'mysql:mysql-connector-java' 추가된 상태입니다. 추가적으로 로그에 쿼리남기는 것도 보고싶어서, dependencies에 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' 만을 추가한 상태입니다. 로그에 남는것 같기는 한데 선생님처럼 예쁘게 보이는 것이아닌 줄글처럼 나오는데요, 혹시 추가하거나 봐야할 게 있을까요? application.properties에는 이렇게 설정했습니다, # JPA Settingsspring.jpa.hibernate.ddl-auto=createspring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.show_sql=true
-
미해결실전! 스프링 데이터 JPA
프록시 초기화
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의 코드를 실행해보다가 궁금한점이 생겨서 질문드립니다. 예전에 MemberTest 클래스에서 아래 코드를 실행했을때는 member.getTeam() 에서 team에 대한 select 쿼리가 나가면서 프록시 초기화가 발생했습니다. @Test public void testEntity() throws Exception { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); //초기화 em.flush(); em.clear(); //확인 List<Member> members = em.createQuery("select m from Member m", Member.class) .getResultList(); for (Member member : members) { System.out.println("member = " + member); System.out.println("-> member.team = " + member.getTeam()); } } 하지만 MemberRepositoryTest 클래스에서 아래의 코드의 경우 member.getTeam() 으로 하면 team에 대한 select 쿼리가 나가지 않고 프록시 초기화가 발생하지 않습니다. 이 두가지 테스트의 차이가 무엇이길래 처음 테스트는 getTeam()으로 프록시 초기화가 되고 두번째 테스트는 getTeam()만으론 안되고 getTeam().getName() 까지 해야 프록시 초기화가 될까요? @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clear(); //when List<Member> members = memberRepository.findAll(); //then for (Member member : members) { member.getTeam(); System.out.println("Team = " + member.getTeam().getClass()); } }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Spring 재시작시 상품 데이터가 사라지는데, hibernate ddl-auto 설정 때문인가요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] Spring이 런타임에서는 상품을 잘 저장하고, 불러오는 것도 정상적입니다. 그런데 스프링을 Re-Run 하게 되면, 상품이 전부 사라지네요. ddl-auto: create를 update로 바꿨더니 데이터가 안 사라지네요. 이거 말고 다른 이유는 없는 건가요?