강사님은 폴더 구조가 webContent 폴더인데 저는 src > mian > webapp 구조입니다. 그래서 올려주신 수업자료의 소스 복붙을 할때에 Java > WebContent 에 있는 META-INF , resources, WEB-INF를 저는 webapp 안에 넣었더니 프로젝트 오른쪽 클릭 후 메이븐 업데이트 할때에 cannot nest ~ to enable the nesting exclude ~ 라며 오류가 생깁니다. 어떻게 해야할까요ㅜㅜ
1. 생성자를 제외한 대부분의 빈은 "컨테이너 생성 -> 빈 객체 생성 -> 의존관계 주입 -> 초기화"의 라이프사이클을 가진다고 하셨습니다. 그러면 생성자 빈의 라이프 사이클은 어떻게 되나요? 강의 15분 48초에서 "생성자 주입 같은 경우에는 객체를 생성해야 되기 때문에 스프링 빈 생성 단계에서 어느정도 일어납니다. "라고 하셨는데, 좀 더 구체적으로 알고 싶습니다. 2. 초기화 콜백, 소멸 전 콜백에 관한 질문입니다. 초기화 콜백은 "의존관계 주입 완료 후 호출"이라고 하셨고, 소멸 전 콜백은 "빈이 소멸되기 직전에 호출"이라고 하셨는데, 여기에서 호출이라는 게 뭔가요? 무엇을 호출한다는 건지요?
MVC1편에서도 타임리프가 나왔지만 실무에서 많이 쓸 일이 없다고 하여 그냥 따라치기만 하고 넘어왔는데요.. MVC2편에서는 본격적으로 타임리프를 길게 강의를 해주셔서 많이 중요한가? 라는 생각이 듭니다. 문법 자체는 어렵지 않은데 스프링MVC패턴뿐만 아니라 스프링 자체도 이해해야할게 많아서 타임리프까지 공부하다 개념이 많이 혼잡해지지 않을까 걱정이 되는데 타임리프를 실무에서 많이 사용하는 편인가요? 많이 사용하다보면 손이 기억을 할 것 같긴한데 타임리프 부분을 어떻게 공부해야할지 고민이 됩니다 ㅜㅜ
우선 관련 다른 댓글들은 읽고왔는데 더 궁금한 점이 있어 질문드립니다. 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로 이것저것 토이프로젝트를 해보면서 고민해보는데 생각보다 적용함에 있어 고려할것들이 넘쳐나 질문을 많이 하게되네요
제가 자바에 대해 완전히 이해하고 있지 않은지 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을 통한 방법을 만들어 두는 게 안전한 방법인가요 ? 뭔가 이 질문은 부끄러운 질문 같은데.. 올려봅니다..
선생님 안녕하세요. 선생님께 도움 정말 많이 받고있습니다. 최근 홈페이지를 구성해 보며 로그인/로그아웃, 권한 관련하여 궁금한 점이 생겼습니다. 로그인을 한 후 어떠한 권한을 가지고 있는 사용자던 간에 로그아웃이 출력되게 하고싶습니다. 검색해보니 spring security 관련 authenticationManager, jwt 등 다양한 방식이 있는걸로 파악했는데요. 혹시 실무에서 어떤 방식을 사용하여 로그인, 로그아웃, 권한 등의 처리를 하시는지가 궁금합니다. 공부 방향을 잡아보고 싶어서 질문드립니다. 감사합니다 !
spring boot를 공부했는데 원격 서버에 배포하는 방법을 모르겠어요 ㅠㅠ 욕심같아서는 도커, 젠킨스, 깃으로 배포하고싶은데... 아니면 젠킨스와 깃만으로 원격서버에 배포하는 것만이라도 알고 싶네요 ㅠㅠ 환경은 window 환경에서 개발하고 ide는 intellij로 Github, jenkins를 이용해 배포해보고 싶습니다. 혹시 비슷한 강의나 자료, 아니면 유료 오프라인 교육이라도 좋으니 추천해주시면 감사하겠습니다. 구글에서 이것저것 찾아봤지만 대부분 맥에서 배포하거나 이해가 잘안되거나 무언가 오류가 발생해서 힘드네요 ㅠㅠ
유니크 데이터 조회시 반환타입을 list // optional 이렇게 두개로 받을 수 있는데, 개인적으로는 optional의 경우 orElseThrow를 통해 예외를 던지거나 원하는 예외로 던질 수 있어 이쪽이 선호되는데 1. 반환타입은 사용하는 사람 취향일까요 아니면 좋은 방식이 있을까요? 2. 기본적으로 스프링이 던지는 예외를 사용하는게 좋을까요 커스텀으로 예외를 만들어 주는게 좋을까요? 답변주시면 감사드리겠습니다.
안녕하세요! 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로 뿌려주는것일까요? 감사합니다!
안녕하세요 강사님! 학원에서는 스프링 원리에 대해서는 안알려주고 무작정 이렇게 코드 짜는거다라고 알려줘서 너무 답답했었는데 강사님 강의를 듣고 속이 뻥~! 뚫렸습니다! 이론강의를 정말 안좋아하는데 강사님 수업은 너무 재밌고 다음 내용이 궁금해서 밤새가면서 봤네요 :D (입문 강의 때는 완전히 이해가 안가더라도 일단 입문을 학습하는게 좋다는 강사님 말만 믿고 따라했더니 정말 되더라구요) 핵심원리 수업을 듣고나서 스프링이 이런거구나 이래서 이 코드를 작성했던거구나 하고 이해는 가는데 다른 사람에게 설명하라고 하면 그정도 실력은 안되는 것 같아 고민입니다. 이걸 어떻게 활용을 해야할지도 문제구요. 사실 제가 학원에서 배웠던 스프링이랑 비슷하면서도 굉장히 다르다는 생각을 합니다. 현재 상황에서 HTTP와 MVC를 듣고 JPA 로드맵으로 넘어갈 지, 핵심원리를 한번 더 복습하고 핵심원리에 대해 완전히 익히고 넘어가야할 지 정말 고민이 됩니다. 이후 강의를 듣다보면 이번 강의에서 놓친 부분들까지 체계를 잡게 될지가 의문스러운 것 같습니다. 어떻게 해야할까요?
안녕하십니까 강사님!! 수업 너무 재밌게 잘 듣고있습니다! 수업을 듣다 궁금한점이 생겨 질문 남깁니다. 요번 강의에서 예시코드로 DiscountPolicyConfig 클래스를 만들고 수동으로 Bean에 주입이 되었는데요, 이때 자동 등록하는 Configuration가 discountPolicyConfig의 Configuration까지 bean으로 주입해버릴 것 같은데, 이 부분은 어떻게 해결할 수 있을까요? 이전에 배운 excludeFilters를 사용하면 Configuration이 있는 모든 클래스의 의존성 주입을 막게돼서 discountPolicyConfig에서 수동으로 주입하는 메서드들이 작동하지 않을것 같네요... 배웠던 것 같기도한데, 헷갈리는 부분이 있어 질문 드립니다!! 항상 좋은 강의 감사합니다 :)
안녕하세요 ! 강의 잘듣고있습니다 제가 궁금한건 처음 강의에서는 http://localhost:8080/hello<-.html이 붙어 있지않아도 그냥 들어가졌지만 지금강의 에서는 http://localhost:8080/basic/hello-form.html 이런식으로 .html이 붙지않으면 에러페이지가 뜹니다 혹시 이유를 알수 있을까요 ?ㅠ
로그인 예제를 진행하면서 비밀번호 암호화까지 진행해보고 싶었습니다. 그래서 구글링으로 스프링 시큐리티 기능에서 PasswordEncoder 기능만 살짝 달아서 적용해봤습니다. 그런데 생각해보니 프론트에서 HTTP로 비밀번호를 전송해서 서버 측에서 암호화를 진행하는 방식은 네트워크 상에서 해킹당하면 의미가 없는 거잖아요? 이런 건 HTTPS 적용하는 방법 외엔 적당한 해결책은 없나요?