스프링부트 gradle 2.6.2 버전인데 설치하고 나서 기본 세팅된 프로그램 돌려봤는데 다음과 같은 워닝이 떠요 Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. 어떻게 해결할 수 있을까요?
안녕하세요. 좋은 강의 정말 감사드립니다^^! 서블릿에 관련하여 궁금한 것이 생겨서 질문 드리고 싶습니다. 1. 서블릿 객체는 언제 생성되나요? 처음 스프링 부트가 띄워질 때 만들어 지는 것인가요? 아니면 url mapping이 되어서 서블릿 객체가 필요해지면 생성되나요? 그리고 스프링에서 사용하는 dispatcherservlet은 언제 생성되나요? 2. HttpServelet reqest 객체에 HTTP 요청 메시지 파싱해서 넣고 처리해주는게 서블릿 객체라고 배웠습니다. 그렇다면 HttpServelet response의 내용을 바탕으로 HTTP 응답 메시지를 생성하는 것도 서블릿이 하나요? 3. 서블릿의 요청 메시지 처리 작업은 언제 이루어지나요? was가 url에 맞는 서블릿 객체의 service()를 수행하는데, 저희가 만든 service에는 요청 메시지 파싱 작업이 없어보입니다! service를 부르기 전에 다른 메소드가 먼저 불리는 것인가요? 감사합니다!
그렇다면 실무에서는 REST API의 예외처리를 처리하는경우, 앞서 배운 ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver 이거는 제쳐두고 궁극기인 ExceptionHandlerExceptionResolver 의 @ExceptionHandler와 이를 모아서 관리하는 @ControllerAdvice 이렇게 2개만 사용이 되는편인가요?
안녕하세요 크게 의미가 있는 질문은 아닌것 같지만 궁금해서 질문드립니다. 13:42초에 리다이렉트 후 hello-from.html을 200으로 응답코드를 내려줍니다. 그리고 HTTP 강의에서도 200으로 내려준다고 배웠던 기억이 있습니다. 그런데 왜 저는 똑같이 했는데 302로 내려주는 걸까요? 감사합니다.
안녕하세요! Model에 데이터를 보관할 때 request.setAttribute를 사용하잖아요. 근데 model에 있는 데이터는 응답으로 나가야하는 데이터면 response가 아닐까라는 생각이 들었는데,, request에서 온 파라미터를 꺼내서 객체를 만들고 model에 그 데이터를 보관해서 뷰로 나가는 거니까 request인건가요? 감사합니다..
안녕하세요 영한님 서포터즈님들 상속 매핑에 대해 예제를 작성하는 중에 궁금한 점이 생겨 질문드립니다. 제가 게시판을 생성해서 게임 게시판. 일정 게시판 등 종류 별로 만들 때, 어떤 전략을 사용하는게 효율적인가 생각해보았습니다. 현재 자식 게시판들은 모두 같은 필드를 가지고 있습니다. 즉, 부모 게시판에 있는 필드만을 사용합니다. 1. SINGLE TABLE 전략 해당 전략을 사용하게 된다면 부모 테이블에 자식 테이블의 필드들이 한 테이블에 있게 됩니다. 특정 게시판을 조회하기 위해서는 모든 게시판 객체를 가져올텐데, 시스템의 규모가 크지 않고, join할 필요가 없기 때문에 현재는 해당 방법이 효율적이라 생각합니다. 2. JOIN TABLE 전략 추후에 게시판들이 늘어나게 되고, 다른 게시판 종류의 추가로 필드를 추가할 필요가 있다고 가정해봤습니다.(확장성 고려) 그렇다면 1번 전략을 사용할 때, 특정 게시판을 조회하기 위해서는 모든 게시판을 다 탐색해야하는데, 조인 전략을 사용하게 되면 특정 게시판을 조회할 때 그 특정 게시판 테이블만 조회하면 된다고 생각합니다. 따라서 게시판들이 늘어나게 되면 해당 방법이 효율적이라 생각합니다. 결론 그래서 제가 예제를 만들 때 사용한 전략에 대해 저 자신을 위와 같은 이유로 납득시켰는데 이게 맞는지 궁금합니다 그렇다면 결국 대부분의 실무에서는 JOIN 전략을 사용할 수 밖에 없나요?
안녕하세요 항상 좋은 답변 남겨주셔서 감사합니다 OrderItems까지 같이 조회되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping ( "/api/v1/simple-orders" ) public List<Order> ordersV1 () { List<Order> orders = orderService .findOrders( new OrderSearch()) ; orders.forEach(order -> { order.getMember().getName() ; order.getDelivery().getStatus() ; }) ; return orders ; } V1 컨트롤러는 다음과 같습니다. @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table (name = "orders" ) public class Order { @Id @GeneratedValue @Column (name = "order_id" ) private Long id ; @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "member_id" ) private Member member ; @OneToMany (mappedBy = "order" , fetch = FetchType. LAZY , cascade = CascadeType. ALL ) // order 가 만들어지면 orderItem 이 만들어지기 때문에 영속성 전이한다 . private List<OrderItem> orderItems = new ArrayList<>() ; @OneToOne (fetch = FetchType. LAZY , cascade = CascadeType. ALL ) private Delivery delivery ; private LocalDateTime orderDate ; @Enumerated (EnumType. STRING ) private OrderStatus status ; ORDER는 다음과 같습니다. @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column (name = "orderitem_id" ) private Long id ; @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "item_id" ) private Item item ; @JsonIgnore @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "order_id" ) private Order order ; private int orderPrice ; private int count ; ORDER_ITEM은 다음과 같습니다. 여기서 V1 컨트롤러를 통해서 쿼리를 날리면, 뒤늦게 Lazy Loading을 통해서 Order_Item들이 프록시 초기화가 되는 것처럼 나갑니다. 그런데 실제로는 프록시가 초기화도 되어있지 않습니다. 정리하면 이렇습니다 1. Order_Items는 Lazy Loading 설정이 되어있고, 프록시 객체를 강제 초기화 하는 과정도 없습니다. 그런데 왜 select 쿼리가 나가게 되는 것인지 알려주실 수 있으실까요? 2. orderItem에 대한 select 쿼리가 나갔음에도 불구하고 실제 응답에 있는 값은 null입니다. 이 경우는 어떻게 이해를 해야할까요? 항상 좋은 답변 주셔서 감사합니다!
안녕하세요. 항상 좋은 답변 해주셔서 감사합니다. 이번에는 @Transactional이 생략되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping ( "/api/v4/simple-orders" ) public List<SimplerOrderQueryDto> ordersV4 () { return orderSimpleQueryRepository .findOrderDtos() ; } @Repository @RequiredArgsConstructor public class OrderSimpleQueryRepository { private final EntityManager em ; public List<SimplerOrderQueryDto> findOrderDtos () { return em .createQuery( " select new jpabook.jpashop.repository.order.simplequery.SimplerOrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from Order o " + " join o.member m " + " join o.delivery d " , SimplerOrderQueryDto. class ).getResultList() ; } } V4 컨트롤러를 개발할 때 궁금한 내용입니다. em.createQuery를 만들어서 dto를 바로 조회해오는 내용입니다. 제가 궁금한 부분은 @Transactional이 없어도 정상동작하는 부분입니다. 위 코드 상에는 어디에도 tx.begin() / tx.commit()이 되어있는 부분이 없는 것으로 보입니다. 따라서 트랜잭션 상태가 아니기 때문에 JPA가 DB 커넥션을 얻지 못한 상황으로 보이는데, DB에서 값을 읽어오고 있습니다. 혹시 어떤 조화로 이렇게... 트랜잭션 없이 값을 불러오는것인지.. 그리고 영속화가 되고 있는것인지를.. 알려주실 수 있으실까요? 감사합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 강사님 안녕하세요! 항상 좋은 수업 감사합니다. 28분 45초 부근에서 타입 오류 처리(필드 타입 Integer인데 사용자가 String으로 입력하는 경우) 스프링 MVC에서 컨트롤러에 진입하기 전에 터진다는 말씀을 듣고 궁금증이 생겨 질문드립니다! 스프링 MVC1 강의에서, ModelAttribute 사용시 요청 파라미터로부터 리소스 객체를 만들고 setXXXX함수가 자동으로 실행되어 필드값이 설정된다고 설명해주셨었습니다. 이 경우, RequestMapping을 통해 컨트롤러에는 진입하지만 setXXXX함수가 실행되는 과정에서 객체의 필드와 타입이 매칭되지 않아 예외를 발생시키는 것이라고 이해하면 될까요? 아니면 타입 오류를 처리하는 별도의 로직이 스프링에 내장되어 있을까요? 제가 이해한 실행 흐름대로면 타입 체크가 들어갈만한 부분이 setXXXX 메서드 말고는 없을것같은데, 또 스프링이 워낙 많은 기능을 제공하다보니 컨트롤러 진입 전에 뭔가 해줄것 같기도 하고 그렇네요 ...ㅎㅎㅎ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Setter를 열어 둘 경우 엔티티에 변경으로 인한 유지보수가 힘들다고 말씀해주셨는데 혹시 Setter를 다 닫고 필요한 것만 연다거나, 비즈니스 메서드를 만드는 예제를 참고할 만한게 있을까요?
import java.util.Scanner ; public class Main { public int solution (String[] str , char word){ int count = 0 ; for (String s : str) { if (s.toLowerCase().charAt( 0 )==word){ count++ ; } } return count ; } public static void main (String[] args) { Main ch = new Main() ; Scanner sc = new Scanner(System. in ) ; String[] str = sc.nextLine().split( "" ) ; char word = sc.nextLine().charAt( 0 ) ; System. out .println(ch.solution(str , word)) ; } } 위 풀이가 왜 오답이라고 나오는건가요? .. 풀이도 정해져있나요?
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. 강의 항상 잘 듣고 있습니다. 또한 항상 수고스럽게 답변해주시는 서포터 분들에게 먼저 감사 말씀 드립니다. 람다식의 용법에 대해서 궁금한 점이 있습니다. private Map<String , String> createParamMap (HttpServletRequest request) { Map<String , String> paramMap = new HashMap<>() ; request.getParameterNames().asIterator() .forEachRemaining(paramName -> paramMap .put(paramName , request .getParameter(paramName))) ; return paramMap ; } 위의 코드에서 paramName -> paramMap.put(paramName, request.getParameter(paramName))); 의 라인에서 paramName 이라는 매개변수를 어떻게 사용할 수 있는건가요? 람다식이 (파라미터) -> (로직) 의 형태((a,b) -> (a+b)로 사용하는 문법인 걸로 알고 있는데 위의 코드가 paramName이라는 매개변수를 받아서 paramMap에 paramName이라는 Key와 request.getParameter(paramName)이라는 Value를 넣는 것으로 이해했습니다. 그런데 paramName을 선언한 곳은 없는데 어떻게 사용할 수 있을까요? 자바 문법적인 강의는 영한 선생님께서 기본이라 안 해주시지만, 이미 기본서를 읽고 왔고 나름대로 검색을 해봤는데도 해답을 얻을 수가 없어서 질문을 남기게 되었습니다.
안녕하세요 localhost:8080/hello를 요청하는 부분에서 매핑페이지가 없다고 오류가 나옵니다. // hello 서블릿 클래스 입니다. //서버는 8080포트라고 잘 뜹니다. //스프링부트 메인 클래스 입니다. 스프링부트 메인페이지가 최상단에 위치해야 한다고 하여 main 클래스를 확인해보아도 hello.servlet 으로 위치해있고 , 위치를 hello로 바꾸어도 결과는 똑같았습니다. webapp에 만들어놓은 정적 페이지를 요청했을땐 잘 실행이 됩니다. 그 이후에 response 등등 여러 클래스를 만들었던 url로 요청을해도 모두 매핑페이지가 없다고 뜹니다. 감사합니다
안녕하세요. 항상 강의 너무 잘 듣고 있습니다! 개인 프로젝트로 질문/답변 게시판 웹사이트 구현을 진행하고 있습니다. 대부분의 로직에 질문/답변 요청의 작성자임을 확인하는 로직이 필요한데 해당 검증 로직은 필연적으로 어플리케이션(DB단 까지)로직이 필요합니다. 제 생각에 검증기validator 클래스를 도입하는 것 보다 Filter나 인터셉터를 활용하는 방식이 좋아보이는데 맞을까요?? 현재 코드는 아래와 같습니다. 게시글의 수정페이지에 대한 Get매핑과 수정하는 PostMapping입니다. Post - 게시글, Account - 계정(작성자) @GetMapping ( "qna/edit/{postId}" ) public String PostEditForm ( @PathVariable Long postId , Model model){ // 사용자 검증 if (!isValidEditRequest(postId)){ return "denied" ; } Post post = postService .findById(postId) ; model.addAttribute( "post" , post) ; return "qna/edit" ; } @PostMapping ( "qna/edit/{postId}" ) public String PostEdit ( @PathVariable Long postId , PostDto postDto){ // 사용자 검증 if (!isValidEditRequest(postId)){ return "denied" ; } // 수정 postService .edit(postId , postDto) ; // 수정 후 수정된 게시글로 이동 return "redirect:/qna/show/" +postId ; } private boolean isValidEditRequest (Long postId) { return postService .isWrittenBy(postId , getAccount().getId()) ; } 질문은 아래와 같습니다. 1. Validator, Filter, Interceptor가 service를 참조해도 괜찮을까요? 2. 해당 로직을 처리하는 정형화된 방식이 Spring Security에 있을까요?? 감사합니다!