묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
선생님. Postman에서 Socket hang up 에러가 납니다.
안녕하세요. 선생님! 회원가입, 로그인은 잘 되는데, AuthenticationHeaderFilter를 적용하고 127.0.0.1:8000/user-service/welcome 으로 get 호출하면 NoClassDefFoundError가 발생합니다. filter 코드도 github에 있는 거 그대로이고, application.yml에도 filter로 등록했는데 postman에서 응답을 받을 수 없다면서 Socket hang up 에러가 납니다. 그런데 get으로 저의ip:port/welcome 으로는 조회가 잘 되요..! 제가 h2를 선생님이 설정한 방식이 아닌 tcp 통신으로 진행하고 있었습니다. 이게 문제인 걸까요..? h2를 tcp로 연결 : (jdbc:h2:tcp://localhost/~/user-service)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Member테이블과 조인을 하는 이유가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] Order를 select할 때, 굳이 Member테이블과 조인하는 이유가 궁금합니다. 조인을 하지 않더라도, order를 조회할때, member 테이블로 따로 select문을 써서 값을 가져오고, 만약 fetchType을 LAZY로 할경우 필요할 때 Join쿼리를 추가적으로 날리는 것으로 알고 있습니다. 제가 생각했을 때는, 유일한 예외경우가 "Member가 null값인 Order가 조회되는 경우"인 것 같은데, 이 부분은 Order.createOrder 생성자에서 처리해줄 수 있을 것 같거든요. (혹은 Order의 member컬럼을 not null로 설정하거나) 이유가 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Autowired 질문드립니다.
Autowired 를 만약 Service에서 하게된다면 Service는 Repository를 DI해야하는것이 통상 개발하는 구조(?) 니까 자동으로 Spring은 Repository를 DI하는것같은 메소드(즉 Autowired) 된 것을 찾고 Autowired된 것들중에 Repository의 Class와 Service에서 Class가 일치하는것들 두개를 자동으로 주입시켜준다고 내부적 프로그래밍이 되어있다고 봐도 무방할까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
bootstrap을 적용 안시켰는데 적용이 되었습니다.
안녕하세요! 야생형 커리큘럼 따라서 먼저 한번 듣고 두번째로 실전1 강의 듣고있습니다. 궁금한게 있어 질문드립니다. bootstrap같은 경우 프로젝트 내부 static 폴더에 css와 js 패키지를 다운로드 받아서 적용시키잖아요, 그런데 두 번째 시도에서 파일을 다운로드 받지도 않고 그냥 실행했는데 예쁘게 적용이 되어있는걸 확인할 수 있습니다. 아마 지난번에 만들었던 프로젝트가 영향을 준 것 같은데 어떻게 그럴수 있을까요? 혹시 캐싱 문제일까 해서 강력 새로고침을 해보기도 했는데 그 문제는 아닌 거 같습니다. 어떻게 이렇게 되는건지 혹시 가르쳐주실 수 있을까요? static 폴더가 비어있는 상태에서 localhost:8080 화면입니다!
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
로그인을 다시 하지 않고 이전에 사용했던 JWT 토큰 사용
안녕하세요 ~ 26분에 user-service를 재실행하고 회원가입을 새로 한 다음에, 로그인을해서 JWT를 새로 발급받지 않고 기존 JWT를 사용하셨는데, JWT토큰은 만료기간만 지나지 않으면 계속 사용할 수 있는건가요??!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Autowired 를 통하여 여러개의 Repository 를 하나의 메소드에서 처리해도되나요?
안녕하세요, 강의잘보고있습니다. 여러가지 lombok 이나 다른 편의라이브러리를 사용하는것도 좋지만 아직은 구조잡기가 우선이라고 생각하여 최대한 필수구조를 잡아가며 짜는연습중인데 강의중에 Requirment... Annotation 을 사용하지않고 아래 방법대로 @Autowired 가 되어도 문제가없는지 질문드립니다. @Service@Transactional(readOnly = true)public class OrderService { private final MemberRepository memberRepository; private final OrderRepository orderRepository; private final ItemRepository itemRepository; @Autowired public OrderService(MemberRepository a, OrderRepository b, ItemRepository c) { this.memberRepository = a; this.orderRepository = b; this.itemRepository = c; }}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository, ItemRepository 차이점
안녕하세요 영한님! Item 엔티티는 처음 저장할 때 id 값이 없다고 하셨는데 Member 엔티티도 똑같지 않나요..? 두 엔티티의 차이점이 잘 이해가 되질 않습니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
혹시 점보트론 적용 안되시는분들은
위에 많은분들이 말씀하셨듯이 현재 부트스트랩 최신버전은 5이기 때문에 점보트론이 적용되지 않는 문제가 있었는데 저처럼 정 신경쓰이시는 분들은 이걸로 쓰시면 될 것 같습니다 <!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"><!-- jQuery library --><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><!-- Popper JS --><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script><!-- Latest compiled JavaScript --><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> header.html의 bootstrap CSS 주석 부분에 붙이시면 됩니다 뒷부분을 아직 안들어서 그런데 CSS만 필요하신거면 4가지중 맨 위에 부분만 이용하셔도 되지 않을까 싶습니다
-
미해결실전! 스프링 데이터 JPA
baseEntity와 softDelete 질문
우선 관련 다른 댓글들은 읽고왔는데 더 궁금한 점이 있어 질문드립니다. Q1. baseEntity에서 abstract class를 사용하지 않고 실제 class를 사용하신 이유 softDelete 사용시 springdatajpa 레퍼런스 닥스에서는 엔티티에 delete flag를 만들어주고, @sql로 delete 실행을 delete flag를 true로 만들어주는 방식을 예제로 두고 있습니다. 그러면 baseEntity에서 - 필드 delete flag 선언 -> 전역 엔티티에 적용 - @sql 로 delete 실행 변경 -> 전역정용 - @where절 delete=false -> 전역 적용 이렇게 할 경우 장점으로는 cascade 옵션으로 delete// orphanRemoval에도 자동으로 delete 쿼리가 업데이트 쿼리로 변경되어 삭제 플레그의 연관관계를 보다 쉽게 처리할 수 있는거로 생각됩니다. 또한 필터? 옵션으로서 실제 플레그로 삭제된 엔티티도 조회 가능하도록 제공하는걸 확인했습니다. 관련 다른 댓글에서 답변해주신것을 보면 영한님은 전역 엔티티가 아닌 엔티티별로 메서드를 정의해주고 연관관계가 있을경우 직접 연관관계 메서드에서 해당 메서드를 사용하시는 것으로 추측됩니다. Q2. 그렇게 사용하시는 걸 선호하시는 이유를 알 수 있을까요? 개인적으로 전역으로 관리하는게 좋겠다 싶었던 이유는 사용자에 의해 기록된 모든 데이터가 기업의 입장에서는 엄청나게 큰 자산이고, 이것을 통해 추천 상품 알고리즘을 위한 데이터로 활용할수도 있고 (주문기록, 회원의 나이 등 정보, 관심상품 등등), 어떠한 비즈니스 정책들을 정하는데 큰 도움이 될거라 싶어 실무에서는 플래그로 삭제 하지 않을까? 해서 전역으로 관리 하는게 좋겠다 싶었습니다. 근데 전역으로 저렇게 처리할 경우, 고객 정보같은 민감한 데이터는 실제로 삭제를 해줘야 할것 같은데 (회원 탈퇴시 같은 경우) 회원과 연관관계가 있는 엔티티들이 엄청나게 엮어 있을때 이런 경우는 어떻게 처리해야 좋을지 감이 잡히지 않습니다. 그래서 추가 질문으로는 Q4. 실무에서 softDelete를 어떤 엔티티에 적용하는지 Q5. 회원은 민감한 정보라 실제 삭제를 할때 관련된 연관관계가 있는 엔티티는 어떻게 처리하는게 좋을지 예를들면 member에 null값으로 그냥 냅두는지 이런 것들이 궁금합니다. 답변주시면 정말정말 감사드리겠습니다. 쿼리dsl 강의 듣기전에 datajpa로 이것저것 토이프로젝트를 해보면서 고민해보는데 생각보다 적용함에 있어 고려할것들이 넘쳐나 질문을 많이 하게되네요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
h2 데이터베이스
안녕하세요 강사님! h2 console에서 test connection을 했는데 whitelabel error page가 뜹니다.. datasource를 추가해서 시도해보고 여러 가지를 시도해봤는 데도 해결이 안 되네요ㅜ
-
해결됨스프링 시큐리티
UsernamePasswordAuthenticationToken
안녕하세요 강사님, 뜬금없는 질문이 될 수 있지만 그래도 궁금한 것은 여쭤보고 싶어 질문 합니다. CustomAuthenticationProvider가 사용하고자 하는 토큰 이름이 UsernamePasswordAuthenticationToken이라는 것은 외워야(기억해야) 하는 것인가요? 만약에 토큰 이름이 기억 안나면 어떻게 해야 하나요? 실제 프로젝트에서 개발할 때 이 흐름과 (클래스, 토큰등의) 이름 정도는 머리속에 다 있어야 하는 것인지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
this.set~(~); vs set~(~); 차이
제가 자바에 대해 완전히 이해하고 있지 않은지 this.를 붙이고 getter/setter를 쓰는 거와 그냥 바로 getter/setter를 쓰는 것, 이 두 개가 다른 가 싶더라구요 OrderItem에서 getItem().~~; 을 보면 그냥 getter를 썼는데 Order에서 this.setOrderStatus(~);를 보면 this를 붙인 후 seter를 써서 제가 아는 걸 쥐어짜내보면 둘 다 똑같을 것 같은 느낌이 들긴 하는데;; 뭐가 다른 건가요 ? class OrderItem{ .. public void cancel() { getItem().addStockQuantity(count);} .. } class Order { .. public void cancel() { if (delivery.getDeliveryStatus() != DeliveryStatus.READY) { throw new IllegalStateException("이미 배송되었거나 배송중입니다."); } this.setOrderStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItemList) { orderItem.cancel(); }} .. } //아 또 갑자기 궁금한 게 생겼는데.. public class Order() { .. private OrderStatus orderStatus; .. public void cancel() { if (delivery.getDeliveryStatus() != DeliveryStatus.READY) { throw new IllegalStateException("이미 배송되었거나 배송중입니다."); } this.setOrderStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItemList) { orderItem.cancel(); }} .. } 에서 this.setOrderStatus(OrderStatus.CANCEL); 이 아니라 orderStatus = OrderStatus.CANCEL; 로 해도 프록시 조회의 문제를 제외하면 상관 없을까요 ? 혹시 모르니 set을 통한 방법을 만들어 두는 게 안전한 방법인가요 ? 뭔가 이 질문은 부끄러운 질문 같은데.. 올려봅니다..
-
미해결실전! 스프링 데이터 JPA
유니크 데이터 조회시 list // optional
유니크 데이터 조회시 반환타입을 list // optional 이렇게 두개로 받을 수 있는데, 개인적으로는 optional의 경우 orElseThrow를 통해 예외를 던지거나 원하는 예외로 던질 수 있어 이쪽이 선호되는데 1. 반환타입은 사용하는 사람 취향일까요 아니면 좋은 방식이 있을까요? 2. 기본적으로 스프링이 던지는 예외를 사용하는게 좋을까요 커스텀으로 예외를 만들어 주는게 좋을까요? 답변주시면 감사드리겠습니다.
-
미해결실전! 스프링 데이터 JPA
안녕하세요! Exception 관련 질문드립니다!
안녕하세요! 6월 방학부터 개학한 오늘까지 김영한님의 모든 강의를 들으며 많은 깨달음을 얻고 실력을 키웠습니다. 먼저, 정말 좋은 강의를 해주셔서 감사하다는 말씀을 드립니다! 제가 질문드리고 싶은건 NoResultException입니다! JpaReopsitory<T,ID>를 상속받는 레포지토리는 Member findByUsername(String username) 를 하고 memberRepository.findByUsername("DB에 없는 username") 을 할시에 null이 들어가면서 exception이 터지지 않는데 MemberRepository.java public Member findByUsernmae(String username) { return em.createQuery("select m from Member m where m.username=:username", Member.class) .setParameter("username", username) .getSingleResult();} memberJpaRepository.findByUsername("DB에 없는 값")을 할시에는 Exception이 터집니다. 먼저, Repository 내에서 NoResultException이 터지고 Repository에서 나갔을때는 EmptyResultDataAccessException이 터지는거에 궁금했었는데 이건 방금 강의에서 말씀해주셔서 아! 하고 알았습니다. 하지만, JpaRepository를 상속받은 레포지토리는 같은 쿼리를 날리지만 어떤 원리로 exception이 터지지 않고 null이 들어가는지 궁금합니다! 혹시, JpaRepository인터페이스를 구현한 클래스에서 Exception을 잡은다음에 null로 뿌려주는것일까요? 감사합니다!
-
해결됨스프링 시큐리티
chapter3 소스코드
안녕하세요 소스코드 관련해서 질문드립니다. chapter3 소스코드는 브랜치에 없는 것 같은데요. 다른 수강생분들은 어떻게 실습 하신 건지 알 수 있을까요? 따로 타이핑쳐서 공부하는 것은 당연한 것이지만 기본 소스가 없어서 어떻게 해야하는 지 답답하네요. chap4는 templates 밑에 구조가 다른 것 같더라구요. 강사님, chapter3소스 지금이라도 새로운 프로젝트로 제공해주실 수는 없으신가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 설계 관련 질문
프론트 엔드에서 전체 category를 조회해서, 화면에 카테고리를 선택할수 있도록 출력해주는 화면이 있고 유저가 게시글을 등록한다고 한다면 --- 1. 아래와 같이 Category 테이블에 모든 카테고리를 저장해 (init), 2. 이 리스트를 전달해주고, (미리 카테고리들은 정해져 있다고 할때, 추가도 할수 있겠지만) 3. user가 게시글을 등록할때 client가 입력한 category를 category table에서 찾아오고 4. 그 값을 기반으로 post와 postCategory에 저장해주는 방식이 되어야 하는거 같은데 (강의들중 어디에서 질문하는게 좋을지 약간 애매해서 여기에 글 올립니다.) ------ 이렇게 하는 방식이 맞을까요? 뭔가 동작 하게끔 할수 는 있는데 올바른 방법같지 않아서 영한님 다른강의들도 들어보면서 같이 몇일째 고민중인데 찜찜하고 명확하게 확신이 안섭니다. 카테고리 목록은 initService를 하나 만들어서 미리 저장해두었습니다. (강의에서 하신 initDb처럼) 답변주시면 감사드리겠습니다. 몇일째 해결이 안되요 ㅠㅠ post테이블의 CATEGORY_TAG는 삭제 예정입니다 public class Post { @Id @GeneratedValue @Column(name = "post_id") private Long id; private String title; @Lob private String desc; private int price; @Enumerated(EnumType.STRING) private Status status; @ManyToOne @JoinColumn(name = "account_id") private Account seller; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "post_category_id") private PostCategory postCategory; // old @Enumerated(EnumType.STRING) private CategoryTag categoryTag; /*@OneToOne @JoinColumn(name = "category_id") private Category category;*/ public Post(String title, Account seller){ this.title = title; this.seller = seller; status = Status.NEW; } // old public Post(String title, String desc, int price, CategoryTag categoryTag, Account seller){ this.title = title; this.desc = desc; this.price = price;// @Converter this.categoryTag = categoryTag; this.seller = seller; status = Status.NEW; seller.addPost(this); } public Post(String title, String desc, int price, Account seller){ this.title = title; this.desc = desc; this.price = price;// @Converter this.postCategory = postCategory; this.seller = seller; status = Status.NEW; seller.addPost(this); } //== 연관관계 메서드 ==/ public void setSeller(Account seller) { this.seller = seller; seller.addPost(this); } //== 바즈니스 로직 ==// // old public static Post post(String title, Account seller, CategoryTag categoryTag){ Post post = new Post(title, seller); post.setCategoryTag(categoryTag); return post; } public void setPostCategory(PostCategory postCategory){ this.postCategory = postCategory; postCategory.setPost(this); }} @Entity@Setter@Getterpublic class PostCategory { @Id @GeneratedValue @Column(name = "post_category_id") private Long id; @OneToOne(mappedBy = "postCategory") private Post post; @OneToOne @JoinColumn(name = "category_id") private Category category;} @Entity@Getter@Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Category { @Id @GeneratedValue @Column(name= "category_id") private Long id; @Enumerated(EnumType.STRING) @Column(unique = true) private CategoryTag categoryTag; public Category(CategoryTag categoryTag){ this.categoryTag = categoryTag; }} @PostMapping("/new2")public PostResponseDto postV2(@RequestBody PostRequestDto postRequestDto, @ApiIgnore HttpSession session){ Account account = getSessionCheckedAccount(session); Post post = new Post(postRequestDto.getTitle(), postRequestDto.getDesc(), postRequestDto.getPrice(), account); Category category = categoryJpaRepository.findByCategoryTag(postRequestDto.getCategoryTag()); PostCategory postCategory = new PostCategory(); postCategory.setCategory(category); post.setPostCategory(postCategory); Long postId = postService.post(post); return new PostResponseDto(postId);}
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
.findAny(); 입력후 에러
@Overridepublic Optional<Member> findByName(String name) { store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); // 이거 오류왜나지} 입력후 missing return statement 에러가 납니다. findAny() 함수가 애초에 null일때 처리하는 함수라고 들었는데 return 타입이 missing이라니 뭐가 문제인지 모르겠습니다.
-
해결됨Spring Boot JWT Tutorial
lombok 실무에서 고려해야 하는 점이 있는게 뭔가요?
안녕하세요. 강사님! 실무에서는 lombok을 사용할 때 고려해야할 몇가지 점이 잇어 주의해서 사용해야한다고 하셨는데 (4:58) 어떤 부분인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Error: Unable to access jarfile .port=9004
Error: Unable to access jarfile .port=9004 해당 오류에 대해 원인을 모르겠습니다
-
미해결실전! 스프링 데이터 JPA
결과 리스트의 size() vs count 쿼리
count 쿼리가 나가는 이유가 궁금합니다. Select 결과로 받아온 리스트의 size()를 실행시키는 게 count 쿼리를 다시 날리는 것보다 비용이 적을 것 같은데, count 쿼리가 다시 나가는 이유가 궁금합니다 :) 강의는 늘 즐겁게 듣고있습니다 감사합니다!