묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
7:50 api 호출시 exception이 발생하면 WebServerCustomer 클래스 호출하는 이유
안녕하세요 선생님~단순한 질문이 하나 있는데요!컨트롤러에서 Exception이 발생하면 반대로인터셉터 -> 서블릿 -> 필터 -> WAS로 예외를 넘겨주고 WAS에서 에러 페이지를 찾는다는 것에 대해서는 이해를 했는데, WebServerCustomizer 클래스를 호출한건 WebServerFactoryCustomizer라는 인터페이스를 구현했기 때문에 해당 클래스를 스프링 컨테이너가 인지하고 호출한건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
*.jsp 주소로 이동하면 jsp파일 다운로드가 됩니다
안녕하세요./jsp/members/new-form.jsp 경로로 이동하면 페이지 이동이 안되고 new-form.jsp 파일을 다운로드 하는 창이 나타납니다.영한님이 작성하신 코드를 복붙했는데도 이런 현상이 나타 납니다.왜 이러는지 이유를 모르겠습니다 ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Spring boot 없이 thymeleaf 사용못하나요?
스프링 부트없이 Spring 사용하려하는데 jsp로 작업했던 파일을 thymeleaf로 변경하기 위해 html파일도 만들고 suffix도 변경해주었는데 아래와 같은 에러가 나옵니다.No mapping for GET /WEB-INF/view/register.htmljsp로 바꿔서 하면 잘되는데 suffix만 html로 바꾸면 페이지를 찾지를 못하네요ㅠㅠ 원래 thymeleaf가 spring boot에서만 사용가능한 것 일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 연결시 JDBC URL
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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 (도움말)이 에러가 뜨면서 들어가지지 않습니다.어떻게 해야할까요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@Controller 사용시 HTTP 요청 과정 질문 / 핸들러 어댑터 과정
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와 th:value의 차이
강의를 듣던중 궁금증이 생겨 질문 드립니다.th:field에 의해서 id, name, value의 속성이 자동으로 만들어진다고 강의 교본에 나와있는데요.그럼 한 태그안에 th:field와 th:value가 동시에 있을 경우에는 어떻게 되나요? th:field에 의해 만들어진 value가 th:value에 의해 덮여지는 건가요?그리고, th:action 과 같은 속성은 태그안에 기존 속성과 타임리프 속성 둘다 존재할 경우 기존 속성을 대체하는 것으로 알고 있는데, id속성과 name 속성은 코드를 돌려보니 th:field와 동시에 존재하더라도, 대체되지 않고, 기존의 id속성, name속성이 사용되었습니다. 타임리프 속성마다 대체여부가 다른 건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
체크박스 value값이 항상 true로 되어 있는 이유
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편 - 백엔드 웹 개발 활용 기술
Hidden 필드의 중요성
히든 필드와 관련된 궁금증이 생겨 질문 드립니다.input 태그의 checkbox가 체크가 되어있지 않으면, 값 자체가 전송되지않는다고 해도, 이게 왜 서버 입장에서 문제가 되는지 잘 모르겠습니다.만약 checkbox가 체크 되어있다면, 'name=값' 의 형태로 서버로 데이터가 날라갈 것이고,checkbox가 체크 되어있지않다면, 아무런 값도 날라가지 않을 텐데,아무런 값이 날라오지 않았을 때를 서버 측에서 체크되어있지 않는 것으로 여기면 되는거 아닌가요?강의교본 2. 타임리프 - 스프링 통합과 폼 11쪽에 나와있는 "사용자가 의도적으로 체크되어 있던 값을 체크를 해제해도 저장시 아무 값도 넘어가지 않기 때문에, 서버 구현에 따라서 값이 오지 않은 것으로 판단해서 값을 변경하지 않을 수도 있다." 라는 말이 이해가 되지 않습니다.사용자가 의도적으로 체크되어 있던 값을 체크 해제해서 서버로 보냈다면, 서버측에서는 해당 체크 박스의 name으로 오는 값이 아예 없다는 것을 알 수 있을 것이고, 그럼 아무 값도 오지 않았다는 것을 체크 되어있지 않다로 여기면 될 것 같은데, 왜 굳이 히든 필드를 사용해야하는 또다른 반례가 있는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
private 메소드에 Optional을 적용하는 건 오버일까요?
/** * 세션 관리 매니저 */ @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로 하는 것은 적절한 사용일까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Member 객체 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 Member 객체에 대하여 질문 있습니다.테스트 코드의 경우 Member member = new Member(); 이런식으로 Member 인스턴스를 생성해서 member.setName("spring"); 이런식으로 쓰이는건 이해가 되는데요Member 클래스 에서나 MemoryMemberRepository 에서나 따로 member라는 참조변수로 Member()라는 인스턴스(Member member = new Member();와 같은것들)를 생성하지 않았는데 바로 아랫줄에서 member.setId(++sequence);가 쓰일수 있는건지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
맵에서 옵션키는 윈도우에서 무슨키인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 맥에서 옵션키가 윈도우에선 무슨키인지 모르겠네요 ^은 ctrl키인거같고 옵션키는 무슨 한자처럼인데 무슨키인가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Data의 @RequiredArgsConstructor에 관하여 질문이 있습니다.
@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편 - 백엔드 웹 개발 활용 기술
enum에 메세지 때려박기....
안녕하세요. 강좌 잘 보고 있습니다. 덕분에 요새 지식을 쌓는 재미를 알아가고 있습니다.메시지와 국제화 강의를 보다가 타임리프로는 #{} 으로 하면 바로 읽어오는 것을 확인하고, 그럼 자바 코드안에서도 가져올 수 있지 않을까 싶어서, 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를 전역으로 설정하거나, 다른 방법으로 이 문제를 해결해야 한다는 건데, 이 부분에 대한 해결책이 마땅히 보이지 않아 질문 남겨봅니다..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터 addInterceptors 가 어디서 호출이 되는건가요?
[질문 템플릿]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.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
템플릿 조각 경로
템플릿 조각의 경로를 지정하는 코드에 의문이 생겨서 질문드립니다.아래 2개의 코드는 실제로 돌려보니 같은 동작을 하는데, <div th:replace="~{template/fragment/footer :: copy}"></div> <div th:replace="~{/template/fragment/footer :: copy}"></div>타임리프엔진이 특정 템플릿 조각을 가져올 때, 템플릿 조각이 어디있는지 찾는 경로는 상대경로나 절대경로 같은 개념이 없는 건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
session을 model에 등록하지 않아도 되는 이유
타임리프에서 제공하는 기본 객체들을 사용하는 강의에서스프링 부트 3.0 이후로는 ${#request} 등을 지원하지 않기 때문에, model에 직접 addAttribute 해야한다고 하셨는데요.request, response, servletContext는 add 하는데,session은 add하지 않아도 되는 이유가 무엇인가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임 리프 Expression Basic Objects 질문
안녕하세요. 강의를 듣던중 궁금한점이 생겨 질문 드립니다.강의에서 basic-objects 템플릿의 결과로위와 같이 나왔었는데,스프링 부트 3.0 이후의 코드로 수정하여 실행하였을 때는,위와 같이 나왔습니다.session 에 해당하는 객체가 달라졌는데, 바뀐 이유가 있나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
static폴더에 index.html이 실행이 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.실행엔 문제가 없는데...