묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
bootstrap을 적용 안시켰는데 적용이 되었습니다.
안녕하세요! 야생형 커리큘럼 따라서 먼저 한번 듣고 두번째로 실전1 강의 듣고있습니다. 궁금한게 있어 질문드립니다. bootstrap같은 경우 프로젝트 내부 static 폴더에 css와 js 패키지를 다운로드 받아서 적용시키잖아요, 그런데 두 번째 시도에서 파일을 다운로드 받지도 않고 그냥 실행했는데 예쁘게 적용이 되어있는걸 확인할 수 있습니다. 아마 지난번에 만들었던 프로젝트가 영향을 준 것 같은데 어떻게 그럴수 있을까요? 혹시 캐싱 문제일까 해서 강력 새로고침을 해보기도 했는데 그 문제는 아닌 거 같습니다. 어떻게 이렇게 되는건지 혹시 가르쳐주실 수 있을까요? static 폴더가 비어있는 상태에서 localhost:8080 화면입니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프와 스프링이 어떻게 구동되는지 잘 이해가 가지 않는데요
제가 html의 구조를 잘 몰라서 그런건지 아니면 강의를 집중해서 듣지 않아서 그런건지는 모르겠지만 html 및 타임리프의 명령어들이 자바와 스프링에 어떻게 주고 받고 이런 것들이 잘 이해가 가지 않습니다 ㅜㅜ html에는 같은 의미의 명령어들만 복사 붙여넣기를 하는데 각 폼마다 수정이 되고 출력이 되고 하는 것이 신기하고요.. MVC2편을 듣고 스프링 완전정복을 다시 복습 할 생각에 있지만 계속 강의를 들어도 되는걸까요 ㅠㅠ
-
해결됨스프링 데이터 JPA
클래스 기반 프로젝션 사용 관련 질문
안녕하세요. 강의 내용대로 CommentSummary를 클래스 기반 프로젝션으로 그대로 넣어서 했는데 아래와 같은 오류가 나오네요. No converter found capable of converting from type [me.whiteship.demospringdatacommonweb.post.Comment] to type [me.whiteship.demospringdatacommonweb.post.CommentSummary] org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [me.whiteship.demospringdatacommonweb.post.Comment] to type [me.whiteship.demospringdatacommonweb.post.CommentSummary] at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322) at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) (중략) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:829) CommentRepositoryTest > getComment() FAILED org.springframework.core.convert.ConverterNotFoundException at CommentRepositoryTest.java:38 사실 인터페이스 기반 프로젝션을 사용하면 될 문제이지만, 클래스 기반 프로젝션으로도 정상적으로 동작할거라 봤는데 동작을 안하네요. Spring 버전이 바뀌면서 클래스 기반 프로젝션을 사용할 수 없게 된걸까요?? 바쁘시겠지만 확인해주시면 감사하겠습니다.
-
미해결스프링 핵심 원리 - 기본편
질문입니다.
1. InitializingBean와 DisposableBean "개발자가 코드를 고칠 수 없는 외부 라이브러리에는 적용할 수 없다."라고 설명하셨습니다. 외부 라이브러리의 코드를 제가 직접 고칠 수 없는 건 알겠는데, 그렇기 때문에 해당 메소드를 적용할 수 없는 이유를 좀 더 상세하게 알려주시면 감사하겠습니다. 2. initMethod와 destroyMethod "코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 해당 메소드를 사용할 수 있다."라고 설명하셨습니다. 여기서 해당 기능이 설정 정보를 사용한다는 말의 뜻과 그렇기 때문에 외부 라이브러리에서 사용할 수 있는 이유를 좀 더 상세하게 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 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; }}
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
bindingFailure 값의 의미
bindingFailure 값의 의미 가 뭔가요..? 언제 true를 하면 되는거죠...? false를 해도 바인딩 실패 시에 바인딩 실패한 값이 그대로 남아있는데, 어떨 때 사용하는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
왜 히든필드가 있나요?
스프링쪽에서 체크박스가 선택이 안됐을 때 NULL이 오는 것이 불편한 것을 알기에 히든필드라는 기능을 제공하는거라면 그냥 체크박스가 선택이 안돼있을 때 NULL이 아니라 False를 리턴하게 만들면 되지 않나요 ? 어째서 선택을 하지 않았을 때 False가 아닌 null을 리턴하는건가요 ?
-
해결됨스프링 핵심 원리 - 기본편
자동 빈 등록과 수동 빈 등록
안녕하세요. 간단한 질문인데요. 자동 빈 등록과 수동 빈 등록의 범위가 궁금합니다. 컴포넌트 스캔을 통해 컴포넌트 어노테이션이 붙은 객체들을 자동으로 등록하는 것을 자동 빈 등록이라고 한다면, 그 외 모든 빈 등록은 수동 빈 등록이라고 볼 수 있을까요? 그렇다면, 기술 지원 객체의 경우는 수동 빈 등록을 추천해주셨는데, 따로 강의 초반에 만드신 @Configuration과 @Bean으로만 구성된 AppConfig와 같은 Class를 만들어 구현하는 것으로 이해하는게 맞을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 요청을 보낼때마다 request, response 객체의 주소값이 변하지 않는 이유?
안녕하세요 강의 정말로 잘 듣고 있습니다! 정말 별거 아닌 질문일 수 있는데 궁금해서 질문 남겨봅니다. 서블릿에서 Request 객체와 Response 객체는 HTTP 요청이 들어올때마다 새로 생성한다고 했는데, 왜 요청을 줄때마다 같은 주소값이 찍히는건가요? 한번 요청 - 응답 하고나면 끝이고 다시 페이지 새로고침을 하면 새로운 HTTP 요청이 가서 새로운 response, request 객체가 생성되야 하는게 아닌지 궁금합니다!! 그냥 WAS에 구현체가 싱글톤으로 있어서 요청이 올때마다 덮어써서 보내주는 방식?? 그런건가요? 스프링, HTTP 지식이 부족해서 나온 너무 이상한 질문이었을지도 모르겠네요 ㅠㅠㅠ..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
image 전송과 함께 데이터는 json으로 보내고 싶은 경우
restAPI에서 image 와 함께 데이터를 같이 보낼때, 보내려는 데이터가 많이 복잡할 경우에는 json으로 보내는 것이 좋을 것 같아 json으로 보내는 방법을 시도해봤는데요 @RequestPart DTO dto 이런식으로 dto를 직접 넣었을때는기본적으로 requestData가 formdata 형식이라 그런지 리졸버가 아예 처리를 하지 못하고, request를 받지 않는 것 같습니다. 그래서 아래와 같이 json의 경우 string으로 받아 테스트 해보았는데요 @PostMapping// @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) public ResponseEntity<ResponseOKDto<PostResponseDto>> post( @RequestPart("data") String data, @RequestPart("file") MultipartFile file, @ApiIgnore HttpSession session) throws IOException { Account account = getSessionCheckedAccount(session); if(!file.isEmpty()){ String path = session.getServletContext().getRealPath("/") + "images/" + file.getOriginalFilename(); file.transferTo(new File(path)); } String o = objectMapper.readValue(data, String.class);// objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); PostRequestDto postRequestDto = objectMapper.readValue(data, PostRequestDto.class); Long postId = postService.post(postRequestDto.getTitle(), postRequestDto.getDesc(), postRequestDto.getPrice(), postRequestDto.getCategoryTag(), account); return new ResponseEntity<>(new ResponseOKDto<>( new PostResponseDto(postId)), HttpStatus.OK); } 이와 같이 포스트맨으로 data를 보냈을 때, 스트링으로 받은 data를 오브젝트 매퍼를 이용해서 바로 DTO로 변환해보니 jackson에서 변환할수 없다는 익셉션이 떠 (Unexpected character ('\' (code 92)): was expecting double-quote to start field name) 디버깅을 해보니 object mapper를 이용해 String으로 한번 변환하고 다시 dto로 변환해야만 잘 동작 했습니다. 아래와 같이 데이터를 ""로 감싸주지 않은 경우에는 해당 에러가 출력되었고요 no String-argument constructor/factory method to deserialize from String value ('{"title":"test","desc":"test","price":10,"categoryTag":"Digital"}') at [Source: (String)""{\"title\":\"test\",\"desc\":\"test\",\"price\":10,\"categoryTag\":\"Digital\"}""; line: 1, column: 1] 제가 했던 접근 방식은 문제점이 일단 2개가 보이는데 - 스트링으로 한번 더 변환을 해줘야해 복잡하다 - 들어온 data 값에 대해 @Validated 를 적용하지 못한다. Q1. 다른 방식으로 data를 json형식으로 받아오고 dto에 대한 validtaion을 적용할 수 있는 방법이 있을까요? Q2. 필드가 아주 많을 경우에 form으로 하나씩 받는건 너무 코드가 지저분 해지는 것 같은데, 벨리데이션과 함께 적용하려면 이렇게 해야하는 걸까요? Q3. objectMapper로 두번 변환 대신에 doubleQuetoALLOW 옵션을 주었는데도 에러가 떴는데, 더블쿼터 에러를 해결할 수 있는 방법이 있을까요? 답변주시면 감사드리겠습니다. 항상 좋은 강의해주셔서 감사합니다
-
미해결윤재성의 만들면서 배우는 Spring MVC 5
42강 기본구조설정에서 경로
강사님은 폴더 구조가 webContent 폴더인데 저는 src > mian > webapp 구조입니다. 그래서 올려주신 수업자료의 소스 복붙을 할때에 Java > WebContent 에 있는 META-INF , resources, WEB-INF를 저는 webapp 안에 넣었더니 프로젝트 오른쪽 클릭 후 메이븐 업데이트 할때에 cannot nest ~ to enable the nesting exclude ~ 라며 오류가 생깁니다. 어떻게 해야할까요ㅜㅜ
-
미해결스프링 핵심 원리 - 기본편
질문입니다.
1. 생성자를 제외한 대부분의 빈은 "컨테이너 생성 -> 빈 객체 생성 -> 의존관계 주입 -> 초기화"의 라이프사이클을 가진다고 하셨습니다. 그러면 생성자 빈의 라이프 사이클은 어떻게 되나요? 강의 15분 48초에서 "생성자 주입 같은 경우에는 객체를 생성해야 되기 때문에 스프링 빈 생성 단계에서 어느정도 일어납니다. "라고 하셨는데, 좀 더 구체적으로 알고 싶습니다. 2. 초기화 콜백, 소멸 전 콜백에 관한 질문입니다. 초기화 콜백은 "의존관계 주입 완료 후 호출"이라고 하셨고, 소멸 전 콜백은 "빈이 소멸되기 직전에 호출"이라고 하셨는데, 여기에서 호출이라는 게 뭔가요? 무엇을 호출한다는 건지요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository, ItemRepository 차이점
안녕하세요 영한님! Item 엔티티는 처음 저장할 때 id 값이 없다고 하셨는데 Member 엔티티도 똑같지 않나요..? 두 엔티티의 차이점이 잘 이해가 되질 않습니다 ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프의 문법? 을 다 암기해야할까요 ?
MVC1편에서도 타임리프가 나왔지만 실무에서 많이 쓸 일이 없다고 하여 그냥 따라치기만 하고 넘어왔는데요.. MVC2편에서는 본격적으로 타임리프를 길게 강의를 해주셔서 많이 중요한가? 라는 생각이 듭니다. 문법 자체는 어렵지 않은데 스프링MVC패턴뿐만 아니라 스프링 자체도 이해해야할게 많아서 타임리프까지 공부하다 개념이 많이 혼잡해지지 않을까 걱정이 되는데 타임리프를 실무에서 많이 사용하는 편인가요? 많이 사용하다보면 손이 기억을 할 것 같긴한데 타임리프 부분을 어떻게 공부해야할지 고민이 됩니다 ㅜㅜ
-
미해결실전! 스프링 부트와 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가지중 맨 위에 부분만 이용하셔도 되지 않을까 싶습니다
-
미해결스프링 핵심 원리 - 기본편
생성자 주입 방법과 setter 주입 방법에 대한 질문
생성자 주입 방법은 필수, 변경 가능성이 없는 경우에 사용된다고 하셨고, setter 주입 방법은 선택, 변경 가능성이 있는 경우에 사용된다고 하셨습니다. 여기에서 '필수/선택'과 '변경 가능성'이 무슨 뜻인지 잘 모르겠습니다. 좀 더 상세한 설명 부탁드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
API로 설계 시 로그인처리
안녕하세요. 강의 잘 보고있습니다. 리액트와 스프링을 사용해서 SPA형식으로 웹 앱을 만들 때 로그인 처리에 대해 궁금해서 그러는데 스프링으로 API개발을 할 때도 강의에서 한거처럼 세션을 이용해서 로그인 처리를 하면 되나요??
-
미해결실전! 스프링 데이터 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로 이것저것 토이프로젝트를 해보면서 고민해보는데 생각보다 적용함에 있어 고려할것들이 넘쳐나 질문을 많이 하게되네요
-
해결됨실전! 스프링 부트와 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을 통한 방법을 만들어 두는 게 안전한 방법인가요 ? 뭔가 이 질문은 부끄러운 질문 같은데.. 올려봅니다..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 / 로그아웃, 권한 관련 질문입니다.
선생님 안녕하세요. 선생님께 도움 정말 많이 받고있습니다. 최근 홈페이지를 구성해 보며 로그인/로그아웃, 권한 관련하여 궁금한 점이 생겼습니다. 로그인을 한 후 어떠한 권한을 가지고 있는 사용자던 간에 로그아웃이 출력되게 하고싶습니다. 검색해보니 spring security 관련 authenticationManager, jwt 등 다양한 방식이 있는걸로 파악했는데요. 혹시 실무에서 어떤 방식을 사용하여 로그인, 로그아웃, 권한 등의 처리를 하시는지가 궁금합니다. 공부 방향을 잡아보고 싶어서 질문드립니다. 감사합니다 !