*.jsp 주소로 이동하면 jsp파일 다운로드가 됩니다
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요. /jsp/members/new-form.jsp 경로로 이동하면 페이지 이동이 안되고 new-form.jsp 파일을 다운로드 하는 창이 나타납니다. 영한님이 작성하신 코드를 복붙했는데도 이런 현상이 나타 납니다. 왜 이러는지 이유를 모르겠습니다 ㅠㅠ
- mvc
- spring
- MVC
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요. /jsp/members/new-form.jsp 경로로 이동하면 페이지 이동이 안되고 new-form.jsp 파일을 다운로드 하는 창이 나타납니다. 영한님이 작성하신 코드를 복붙했는데도 이런 현상이 나타 납니다. 왜 이러는지 이유를 모르겠습니다 ㅠㅠ
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 부트없이 Spring 사용하려하는데 jsp로 작업했던 파일을 thymeleaf로 변경하기 위해 html파일도 만들고 suffix도 변경해주었는데 아래와 같은 에러가 나옵니다. No mapping for GET /WEB-INF/view/register.html jsp로 바꿔서 하면 잘되는데 suffix만 html로 바꾸면 페이지를 찾지를 못하네요ㅠㅠ 원래 thymeleaf가 spring boot에서만 사용가능한 것 일까요?
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. H2 연결할때 jdbc:h2:~/test (최초 한번) 이렇게 해서 ~/ test.mv .db 파일 생성 되는지 확인을 했습니다. 접속도 됩니다. 근데, 이후부터는 jdbc:h2:tcp:// localhost/~/test 이렇게 접속 하라고하는데, jdbc:h2:~/test 은 접속이 가능한데, jdbc:h2:tcp:// localhost/~/test 이렇게 쓰면 Connection is broken: " java.net .SocketTimeoutException: connect timed out: localhost " [90067-200] 90067/90067 (도움말) 이 에러가 뜨면서 들어가지지 않습니다. 어떻게 해야할까요??
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요! 영한님 강의 질 좋은 강의 너무 감사하게 보고 배우고 있습니다! 다름이 아니라, 엔터티 설계시 주의점 강의에서 setter를 사용하지 않기위해서 엔터티 설정을 아래와 같이 코드 수정을 해보았는데 이렇게 하는 게 더 안전한 방법인가요?? 실무에서도 이렇게 사용하는지 매우 궁금합니다..! Order 엔터티 public class Order{ ... public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); // orderItem.setOrder(this); OrderItem.builder() .order(this) .build(); } public void setDelivery(Delivery delivery){ this.delivery = delivery; // delivery.setOrder(this); Delivery.builder() .order(this) .build(); } } OrderItem 엔터티 ... @NoArgsConstructor public class OrderItem { ... @Builder public OrderItem(Order order){ this.order = order; } }
미해결
실전! Querydsl
선생님이 올린 3.0 + querydsl로 다시 gradle했는데 Gradel -> other -> complieQuerydsl이 없는데 상관없는건가요?
해결됨
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
1. 클라이언트가 HTTP 요청을 한다 ( http://localhost:8080/springmvc/v1/members/new-form ) 2. DispatcherServlet 에서 핸들러를 조회를 한다 @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } } 서버에 등록되어 있는 핸들러(컨트롤러) @Controller : 핸들러 등록하기 @RequestMapping : 클라이언트가 요청한 URL 과 매핑 후 메서드를 실행한다. 3. 이 조회한 핸들러를 처리할 수 있는 핸들러어댑터를 조회하고 이 어댑터를 통해서 핸들러(컨트롤러)를 호출한다. 전 시간에는 핸들러 어댑터 리스트들을 다 만들어서 iter 돌려서 핸들러를 처리할 수 있는 어댑터를 찾고 그 핸들러 어댑터가 핸들러를 호출하도록 하였습니다 이번시간에 이 과정들은 스프링 내부에서 다 해준다는 말인가요 ? 이 내부 과정들을 이해했다면 저는 @RequestMapping 으로 클라이언트의 요청과 처리할 메서드를 매핑하고 @Controller 로 핸들러를 등록하기만 하면 되는건가요?
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
질문은 총 2개입니다. 이 밑에 있는 사진을 참고해서 질문을 봐주시면 될 것 같습니다. 감사하겠습니다. 1. MemoryMemberRepository이 외부 패키지에서 연결이 되지 않는다고 하는데 이 말이 무엇인지 이해가 되지 않습니다. 이 문제를 어떻게 해결하면 좋을까요..? <왼쪽 오류> hello.hellospring.repository.MemoryMemberRepository is not public in hello.hellospring.repository; cannot be accessed from outside package <오른쪽 오류> java: hello.hellospring.repository.MemoryMemberRepository is not public in hello.hellospring.repository; cannot be accessed from outside package (혹시 몰라 코드도 함께 올립니다.) package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; class MemberServiceTest { MemberService memberService; MemoryMemberRepository memberRepository; @BeforeEach public void beforeEach() { memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepositorypository); } @AfterEach public void afterEach() { memberRepository.clearStore(); } @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("hello"); //When Long saveId = memberService.join(member); //Then Member findMember = memberRepository. findById(saveId).get(); assertEquals(member.getName(), findMember.getName()); } @Test public void 중복_회원_예외() throws Exception { //Given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //When memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class,() -> memberService.join(member2));//예외가 발생해야 한다. assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } } memberRepository를 입력했는데 밑에 빨간줄이 뜹니다. 혹시 무엇인가 import를 해주지 않은 것인지 판단되어 ctrl+space를 눌러도 클릭되는 것은 없습니다. 그럼 왜 빨간줄이 떠있는 것인지 궁금합니다.
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의를 듣던중 궁금증이 생겨 질문 드립니다. th:field에 의해서 id, name, value의 속성이 자동으로 만들어진다고 강의 교본에 나와있는데요. 그럼 한 태그안에 th:field와 th:value가 동시에 있을 경우에는 어떻게 되나요? th:field에 의해 만들어진 value가 th:value에 의해 덮여지는 건가요? 그리고, th:action 과 같은 속성은 태그안에 기존 속성과 타임리프 속성 둘다 존재할 경우 기존 속성을 대체하는 것으로 알고 있는데, id속성과 name 속성은 코드를 돌려보니 th:field와 동시에 존재하더라도, 대체되지 않고, 기존의 id속성, name속성이 사용되었습니다. 타임리프 속성마다 대체여부가 다른 건가요?
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
checkbox 강의를 듣던 중 의문점이 생겨 질문드립니다. 아래의 코드는 강의에 사용되었던 단일 체크박스 - 판매 여부의 코드입니다. <input type="checkbox" id="open" name="open" th:field="*{open}" class="form-check-input"> 아래의 코드를 이용하여 실제 렌더링된 페이지의 소스를 보면, 체크 하지 않을시, <input type="checkbox" id="open" name="open" class="form-check-input" disabled value="true"> 체크 할시, <input type="checkbox" id="open" name="open" class="form-check-input" disabled value="true" checked="checked"> checked="checked"의 여부만 다르고, value는 둘다 "true"로 되어있었습니다. 컨트롤러에서는 item 객체를 model에 담을 때, item.open의 값을 false(체크 안됌), true(체크 됌)으로 명확하게 설정한 후, 이를 model에 담아서 전달했을텐데, 왜 실제 렌더링된 소스에서는 둘다 value="true"로 나오는 건가요? 만약에 타임리프가 item.open의 value 값을 토대로 checked="checked"를 넣어줄지를 정하는 거라면, 당연히 value에 저장되는 값이 실제 체크를 했는지에 따라 달라져야하는게 아닌가라는 생각이 들었습니다. + 강의 교본 2. 타임리프 - 스프링 통합과 폼 19페이지의 "타임 리프는 th:field에 지정한 값과 th:value의 값을 비교해서 체크를 자동으로 처리해준다" 의 설명이 너무 추상적인 것 같습니다. 같은 강의 교본 4페이지를 보면 th:field가 id, name, value 속성을 모두 자동으로 만들어준다고 되어있는데, 위의 "th:field에 지정한 값"이라는 것은 정확히 무엇을 지칭하는 말인지 모르겠습니다. 좀 더 자세한 설명을 해주셨으면 좋겠습니다.
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
히든 필드와 관련된 궁금증이 생겨 질문 드립니다. input 태그의 checkbox가 체크가 되어있지 않으면, 값 자체가 전송되지않는다고 해도, 이게 왜 서버 입장에서 문제가 되는지 잘 모르겠습니다. 만약 checkbox가 체크 되어있다면, 'name=값' 의 형태로 서버로 데이터가 날라갈 것이고, checkbox가 체크 되어있지않다면, 아무런 값도 날라가지 않을 텐데, 아무런 값이 날라오지 않았을 때를 서버 측에서 체크되어있지 않는 것으로 여기면 되는거 아닌가요? 강의교본 2. 타임리프 - 스프링 통합과 폼 11쪽에 나와있는 "사용자가 의도적으로 체크되어 있던 값을 체크를 해제해도 저장시 아무 값도 넘어가지 않기 때문에, 서버 구현에 따라서 값이 오지 않은 것으로 판단해서 값을 변경하지 않을 수도 있다." 라는 말이 이해가 되지 않습니다. 사용자가 의도적으로 체크되어 있던 값을 체크 해제해서 서버로 보냈다면, 서버측에서는 해당 체크 박스의 name으로 오는 값이 아예 없다는 것을 알 수 있을 것이고, 그럼 아무 값도 오지 않았다는 것을 체크 되어있지 않다로 여기면 될 것 같은데, 왜 굳이 히든 필드를 사용해야하는 또다른 반례가 있는지 궁금합니다.
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
/** * 세션 관리 매니저 */ @Component public class SessionManager { public static final String SESSION_COOKIE_NAME = "mySessionId"; private final Map<String, Object> sessionStore = new ConcurrentHashMap<>(); /** * 세션 생성 * * @param value 저장할 값 * @param resp HTTP Servlet Response */ public void createSession( Object value, HttpServletResponse resp ) { // 세션 ID를 생성하고, 값을 세션에 저장 String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId, value); // 쿠키 생성 Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); resp.addCookie(mySessionCookie); } /** * 세션 조회 * * @param req HTTP Servlet Request * @return 조회된 세션에 대한 정보(값) */ public Object getSession( HttpServletRequest req ) { return findCookie(req, SESSION_COOKIE_NAME) .map(value -> sessionStore.get(value.getValue())) .orElse(null); } /** * 세션 만료 * * @param req HTTP Servlet Request */ public void expire( HttpServletRequest req ) { findCookie(req, SESSION_COOKIE_NAME) .ifPresent(cookie -> sessionStore.remove(cookie.getValue())); } /** * 쿠키 찾기 * * @param req HTTP Servlet Request * @param cookieName 찾을 쿠키 이름 * @return 찾은 쿠키 */ private Optional<Cookie> findCookie( HttpServletRequest req, String cookieName ) { if (req.getCookies() == null) { return Optional.empty(); } return Arrays.stream(req.getCookies()) .filter(cookie -> cookie.getName().equals(cookieName)) .findAny(); } } 지난 강의 시간에 Optional에 대해서 말씀하셨길래 SessionManager에 한 번 적용해 보았습니다. getSession 같이 외부로 나가는 것이 아닌, 클래스 내부에서만 사용할 수 있는 findCookie에 Optional을 사용하는게 적절한지 의문이 들어 질문남겨봅니다. Optional을 찾아보니, null을 반환할 수 있는 함수에 대해 사용할 수 있으며, 파라미터보다 반환값으로 사용하는게 맞다고 얘기를 하더군요. 그럼 반환값에 사용하면 위와 같이 ifPresent나 orElse를 이용해 실제 객체 값을 들고 와야하기도 해서, 지금처럼 간단한 로직에서는 굳이 Optional이 아닌, Cookie를 반환해서 if문을 이용해 null체크를 하는게 맞다고 생각은 합니다만.. findCookie는 클래스내부에서 사용하는게 적절하지 않다면, getSession같이 클래스 외부에서 사용할 수 있는 메서드에 대해 반환값을 Optional로 하는 것은 적절한 사용일까요?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] @JoinColumn(name="parent_id") 의 parent_id 는 어디서의 column을 의미하는건가요?? @Column(name="parent_id") 부분이 없는거 같은데 어디서 parent_id의 컬럼이 만들어져서 이것과 join을 하는건지 궁금합니다.
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 Member 객체에 대하여 질문 있습니다. 테스트 코드의 경우 Member member = new Member(); 이런식으로 Member 인스턴스를 생성해서 member.setName("spring"); 이런식으로 쓰이는건 이해가 되는데요 Member 클래스 에서나 MemoryMemberRepository 에서나 따로 member라는 참조변수로 Member()라는 인스턴스(Member member = new Member();와 같은것들)를 생성하지 않았는데 바로 아랫줄에서 member.setId(++sequence);가 쓰일수 있는건지 궁금합니다.
해결됨
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 강의 잘듣고있습니다. 주문서비스에서 cancel이 발생하면 위 Order 엔티티에서 delivery 객체 배송상태 검증 부분이 있는데 Order 와 Delivery 연관관계 매핑시 FetchType.LAZY로 설정되어있으니 잘못검증되는건 아닌가요? jpql로 fetch join으로 가져와야 하는 케이스아닌가해서요
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 맥에서 옵션키가 윈도우에선 무슨키인지 모르겠네요 ^은 ctrl키인거같고 옵션키는 무슨 한자처럼인데 무슨키인가요?
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Data public class ItemUpdateDto { @NotNull private Long id; @NotNull private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; private Integer quantity; } 이 코드를 보면 @RequiredArgsConstructor로 이용해서 생성자를 만드는 것을 확인할 수 있는데, 저 코드의 설명을 보면 final 필드나 @NonNull 애노테이션이 붙은 필드에 한해서 생성자를 만들어준다고 되어있습니다. Generates a constructor with required arguments. Required arguments are final fields and fields with constraints such as @NonNull. 그런데, ItemUpdateDto에는 final 객체가 없어서 빈 생성자가 생성될거라고 예상이 됩니다. 실제로 코드에 빈 생성자를 넣으면, RequiredArgsConstructor에 빨간줄과 함께 이미 정의되었다고 표시도 됩니다. 그렇다면, Spring에서 폼데이터를 받을때, 생성자가 아닌, Setter를 이용해서 주입을 받는 것일까요? 그렇다면, 저번 수업에서 말씀하신대로 실제로 사용할때는 @Data 가 아닌, Getter, Setter만 제한적으로 적용하는게 맞을까요?
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요. 강좌 잘 보고 있습니다. 덕분에 요새 지식을 쌓는 재미를 알아가고 있습니다. 메시지와 국제화 강의를 보다가 타임리프로는 #{} 으로 하면 바로 읽어오는 것을 확인하고, 그럼 자바 코드안에서도 가져올 수 있지 않을까 싶어서, test 코드에서 알려주셨던 방법으로 가져와 봤습니다. option.regions.seoul = 서울 option.regions.busan = 부산 option.regions.jeju = 제주 @Slf4j @Controller @RequestMapping("/form/items") @RequiredArgsConstructor public class FormItemController { private final ItemRepository itemRepository; private final MessageSource ms; @ModelAttribute("regions") public Map<String, String> regions( Locale locale ) { Map<String, String> regions = new LinkedHashMap<>(); regions.put("SEOUL", ms.getMessage("option.regions.seoul", null, locale)); regions.put("BUSAN", ms.getMessage("option.regions.busan", null, locale)); regions.put("JEJU", ms.getMessage("option.regions.jeju", null, locale)); return regions; } } 이 때에는 정상적으로 가져와지는 것을 확인했습니다. 그런데 문제는, ENUM 이었습니다. option.itemType.book = 도서 option.itemType.food = 음식 option.itemType.etc = 기타 public enum ItemType { BOOK("도서"), FOOD("음식"), ETC("기타"); private final String description; ItemType(String description) { this.description = description; } public String getDescription() { return description; } } 저의 목적은 이렇습니다. Enum의 강점을 유지하면서도, 필드의 description을 국제화 시키고 싶다. 하지만 여기서 문제가 발생했습니다. DI를 받기 위해 먼저 Enum을 Bean으로 등록시키기 위해 @Component 키워드를 넣어 시도해보니 컴파일 에러가 터졌습니다. 찾아보니, @Component를 이용해 Bean으로 등록하기 위해선, Enum을 상속받은 Proxy가 만들어져야 하는데, Enum은 상속할 수 없었던게 문제였습니다. 그렇다면, MessageSource를 전역으로 설정하거나, 다른 방법으로 이 문제를 해결해야 한다는 건데, 이 부분에 대한 해결책이 마땅히 보이지 않아 질문 남겨봅니다..
미해결
실전! Querydsl
안녕하세요! querydsl 강의를 보고 실무에 적용 하던 중 중첩 객체에 대해서 한번의 join query로 만들 수 없을지 궁금하여 질문 드립니다. 만약, A -< B -< C (-< 은 one to many 를 의미) 관계를 가진 객체가 있다고 할 때 selectFrom(A) .leftJoin(A.B) .leftJoin(A.B.C) .where(A.id.eq(1)) .fetch(); 위 코드의 반환 값이 아래와 같기를 희망 하는데요 A = { id: 1, Bs: [ { id : 1, Cs : [ { id: 1 } ] } ] } oneToMany를 조인 하게 되면, SQL은 many의 row를 반환하게 되면서, A객체가 B의 갯수만큼 반환 되게 됩니다. group by등을 통해 해결 하려 했을 때는, oneToMany 컬렉션들이 모두 불러와지지 않는것을 확인 하였고, group by를 활용 하지 않고, 모든 row를 불러와서 aggregate하는 방식으로 코드를 구현 했습니다. 매번 쿼리문을 작성할 때 마다 aggregate하는 코드를 작성하는 것은 옳지 않을 것 같아, 혹시 더 나은 방법이 있을지 문의 드립니다. 혹시 중첩 쿼리를 join 으로 모두 찾아 객체에서 맵핑하려는 시도가 bad practice라면 쿼리 숫자가 늘어나더라도, findByAId, findByBId 등의 방식으로 여러번 쿼리를 하고, 중간에 캐시 레이어를 두는것이 더 나을지도 궁금 합니다. 항상 좋은 강의 감사합니다 :)
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 여기에 질문 내용을 남겨주세요. package hello.login; import hello.login.web.argumentresolver.LoginMemberArgumentResolver; import hello.login.web.filter.LogFilter; import hello.login.web.filter.LoginCheckFilter; import hello.login.web.interceptor.LogInterceptor; import hello.login.web.interceptor.LoginCheckInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.Filter; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new LoginMemberArgumentResolver()); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/css/**", "/*.ico", "/error"); registry.addInterceptor(new LoginCheckInterceptor()) .order(2) .addPathPatterns("/**") .excludePathPatterns("/", "/members/add", "/login", "/logout", "/css/**", "/*.ico", "/error"); } // @Bean public FilterRegistrationBean logFilter() { FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(new LogFilter()); filterRegistrationBean.setOrder(1); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } // @Bean public FilterRegistrationBean loginCheckFilter() { FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(new LoginCheckFilter()); filterRegistrationBean.setOrder(2); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } } Configuration 이 Component이고 ComponentScan 대상이어서 빈으로 등록 된다고 이해하고있었는데 @Configuration 이 달려있고 WebMvcConfigurer 상속 받는 상태에서 addInterceptors 메소드를 오버라이드 해주기만 하면 서버구동시 컴파일 과정에서 스캔을하다 @Override addInterceptors 메소드가 있으면 내부적으로 조건에 맞을시 매 uri 호출마다 addInterceptors 를 자동으로 호출하는건가요? 따로 맵핑되어서 uri 같은걸로 호출되는것도 아닌것같은데 어디서 호출이 되는건가요? .addPathPatterns("/**") .excludePathPatterns("/css/**", "/*.ico", "/error"); 이부분은 이해가 가는데 여태 맵핑된 uri 로 찾아다니는거만 생각하다보니까 이해가 잘안되네요
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 있는데 해당 글 참고해서 설정 변경했는데 실행 자체가 안됩니다. 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 https://www.inflearn.com/questions/664806/intelli-j-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90 위의 글 참고해서 설정 변경해 보았지만 첨부한 사진과 같이 실행이 되지 않습니다. 스프링 부트 3.0 버전이상이라 jdk 17 버전 사용하고 있는 상황입니다. Execution failed for task ':test'. > There were failing tests. See the report at: file:///D:/인프런/hello-spring/build/reports/tests/test/index.html * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights.