묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프를 사용하지 않는다면
타임리프를 사용하지 않는 경우 bindingResult를 view에 어떻게 전달해주나요?타임리프인 경우에만 view에 전달되는것 아닌가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
version 5. 어댑터 handle 메서드 인자 관련
안녕하세요, 강의를 수강하고 있는 학생입니다. 이번 강의를 들으면서 궁금한 점이 생겨 글을 작성하게 되었습니다. version 2에서 version 3로 넘어갈 때 해결한 문제 중 하나인 HttpServletRequest와 Response에 종속되어 있다와 관련하여 궁금한 점이 생겼습니다. version 5에서 해당 핸들러(컨트롤러)에 맞는 어댑터를 찾아서 handle 메서드를 부를 때 인자로 핸들러를 제외하고도 HttpServletRequest 타입의 request, Response 타입의 response를 전달하는데, 그 이후에 딱히 이 두 인자에 종속될 필요가 없다고 느꼈습니다. 따라서, FrontController 서블릿에서 creatParamMap 메서드를 통해 파라미터를 담은 Map 타입 객체를 생성하여 인자로 전달하면 어떨까라는 생각이 들었습니다. 이러한 부분은 구현하는 사람의 재량인지, 제가 위에 설명한 방법에 문제가 있어서 그렇게 하지 않는 것인지 궁금합니다. 질문글 읽어주셔서 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
302 리다이렉트 대신에 302 응답코드로 뷰 템플릿 부르기
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]```java@PostMapping("/add") @ResponseStatus(HttpStatus.FOUND) public String addItemV7(Item item) { Item savedItem = itemRepository.save(item); return "basic/item"; }위와 같이 302 응답코드를 가지고 보내면 왜 안되는 건가요? (사이트에서는 302로 응답이 오는게 확인됨)302가 redirect 관련 응답코드라서 redirect location이 없어서 그런건가요?그렇다면 302가 요청 메서드를 Get으로 바꿔주는건 오직 redirect location으로 이동했을 때만 인가요?사이트에서 확인을 해보니
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요
유연한 컨트롤러1 - v5 강의를 듣다가 중간에 코드가 많아져서 이 강의에서 한 전체 코드를 보고 중간에 제가 이해를 제대로 "완벽" 하게 했는지 좀 의문이 드는데 이건 저만 그런건 아닐까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ArgumentResolver 구현 시 supportsParameter 메서드 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]우리가 직접 만든 LoginMemberArgumentResolver 를 등록하게 되면 스프링에서는 @Login 을 처리할 수 있는 ArgumentResolver 를 찾기 위해 supportsParameter 라는 메서드를 통해 지원 여부를 확인할 것으로 예상이 됩니다.public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { log.info("supportsParameter 실행"); boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType()); return hasLoginAnnotation && hasMemberType; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { log.info("resolveArgument 실행"); HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); HttpSession session = request.getSession(false); if (session == null) { return null; } return session.getAttribute(SessionConst.LOGIN_MEMBER); } }그럼 실제 resolve 하기 전에 supportsParameter 가 먼저 호출될 것이므로 로그에 "supportsParameter 실행" 이라는 것이 남아야 할 것 같은데 실제 콘솔창에는 남지 않습니다. 원인이 무엇인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.계속 빌드 오류가 뜹니다....자바 버전도 17 이상인데 뭐가 문제인걸까요...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
java.lang.NullPointerException: Cannot invoke "java.util.Optional.ifPresent(java.util.function.Consumer)" because the return value of "..."is null
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 회원테스트 기술 부분을 학습하고있는데 테스트케이스 오류가 났습니다 어떻게 해결해야할지 몰라 질문글을 적었습니다아래는 테스트 코드입니다import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberRepository memberRepository = new MemoryMemberRepository(); MemberService memberService = new MemberService(); //테스트는 과감하게 한글로 작성 가능 //테스트할땐 given,when,then 틀 사용 @Test void 회원가입() { //given Member member = new Member(); member.setName("hello"); //when Long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); org.assertj.core.api.Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test void findMembers() { } @Test void findOne() { } }그리고 MemberService코드입니다package hello.hello_spring.service; import hello.hello_spring.domain.Member; import hello.hello_spring.repository.MemberRepository; import hello.hello_spring.repository.MemoryMemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /*회원가입*/ public Long join(Member member){ validateDuplicateMember(member); //중복회원검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member){ memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalArgumentException("이미 존재하는 회원입니다"); }); } /*전체회원 조회*/ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); } }아래는 오류 메시지 입니다java.lang.NullPointerException: Cannot invoke "java.util.Optional.ifPresent(java.util.function.Consumer)" because the return value of "hello.hello_spring.repository.MemberRepository.findByName(String)" is nullat hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:22)at hello.hello_spring.service.MemberService.join(MemberService.java:15)at hello.hello_spring.service.MemberServiceTest.회원가입(MemberServiceTest.java:24)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Process finished with exit code -1 어떻게 해결하면 좋을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러매핑
이전에 V5예시에서 URL에 대한 핸들러 매핑은 객체가 된것을 확인할 수 있습니다 @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); . } }이후 스프링 MVC에서 RequestMappingHandlerMapping은 스프링 중에서 @RequestMapping또는 @Controller가 클래스 레밸에 붙어 있는 경우에 매핑 정보로 인식한다라고 하셨는데 그렇다면 URL 정보가 스프링빈(객체)로 매핑되는것이 핸들러 매핑이 되는 것인가요?? @RequestMapping이 클래스 단위가 아니라 메서드 단위에 적용된다는 것은 핸들러 어뎁터조회, 핸들러 어뎁터 실행이 끝나고 실제 핸들러가 실행되는 부분이라고 이해했습니다..
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
세션1이 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다는 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 아래는 강의 자료에 있는 내용입니다.------------------------------------------세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터 를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다.------------------------------------------ money=10000인 상태에서 세션1이 money를 5000으로 바꾼다고 하더라도 커밋을 하지 않는다면, 세션2가 보고 있는 money는 여전히 10000인 거고 10000에 접근하는 거 맞나요? 그렇다면 세션1이 롤백을 하더라도 세션2은 기존 10000을 수정하고 있는 거니 잘못된 데이터를 수정하는 건 아니지 않나요? 위에 굵게 표시한 부분 어떤 의미인지 궁금합니다. 아니면 위에 있는 설명은 커밋되지 않는 데이터에 접근하는 경우라고 가정하는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:classappend 시 No Operation VS 빈값
[질문 내용]필드 오류 처리 개선 방안에서 _ 이라는 No-Operation 명령어를 사용해서 처리했는데, 그냥 ‘’ 이렇게 빈 값을 넣어도 처리가 됩니다. No Operation 사용과 빈값 사용에 어떤 차이가 있을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemRepository 인터페이스 생성 이유??
1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ItemRepository 인터페이스 생성한 이유가 궁금해서 질문드립니다.강의에서 해당 인터페이스를 생성하는 이유가 영한님이 알려주신 강의에서는 jdbctemplate, mybatis, jpa등등 데이터 접근 기술들을 알려주셔서 해당 구현체들을 추상화 목적으로 만드신건가요?? 아니면 현업에서는 일반적으로 영한님처럼 파일 구조로 만드나요??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.자바 버전 17이상을 사용하는데 빌드가 안됩니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
게시물 필터 기능 구현
타임리프와 스프링으로 게시판을 만들어보고 있는데 한 가지 질문을 좀 드리게 되었습니다.필터와 인터셉터 관련 부분을 수강 후 게시판 혐오글 작성 방지 기능을 구현해보고자 하는데요.인터셉터가 요청을 가로채 인터셉터의 prehandle에서 혐오글 포함 시 인터셉터가 호출이 되면서 컨트롤러가 호출되지 않도록 하는 부분까진 이해가 됐습니다만 현재 SSR 방식의 타임리프를 사용하고 있어 게시물 생성 부분은 @RestController 어노테이션을 사용해 자바스크립트의 fetch() 함수로 API를 호출하고 있습니다. 그러면 아무리 인터셉터에서 컨트롤러를 호출시키지 않는다고 하더라도 등록된 이벤트에 의해 API를 호출하면 게시글이 생성이 될 수 밖에 없는 상황인데 이 상황에선 어떻게 해결을 해야 되는지 조언을 듣고 싶습니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
인텔리제이 자동정렬 문제
강의 7분 21초쯤 save.jsp 내용을 따라서 작성하는데<ul> <li>id=<%=member.getId()%> </li> <li>username=<%=member.getUsername()%> </li> <li>age=<%=member.getAge()%> </li> </ul>계속 이런식으로 닫는 태그가 자동으로 밑으로 가버리더라구요. 구글링 해봐도 잘 못 찾겠어서 질문드립니다 ㅠ 다시 위로 올려놔도 다른 작업할 때 다시 저렇게 변해버리네요 강의처럼 뒤에 딱 붙게 해서 보고싶은데 혹시 설정 방법이 따로 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터를 활용한 로그인 인증
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.addPathPatterns을 사용하여 모든 경로에 인터셉터를 추가하고 excludePathPatterns에 제외하고 싶은 경로를 작성하여 제거하여 인터셉터를 특정 URL에만 적용할 수 있다는 점을 배웠습니다. 제가 궁금한 점은 여기서 만약에 서버에서 지원하지 않은 URL 즉, 404 에러를 발생시키는 URL에 접근할 경우에도 로그인 페이지가 나오고 로그인을 완료하면 그 후에 404 페이지가 나옵니다. 이렇게 컨트롤러가 지원하지 않은 URL에는 인터셉터를 적용시키 않으려면 어떻게 설정을 해야하는건가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Whitelabel Error Page로 넘어가는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]화면상에 오류메시지가 뜨지 않고 Whitelabel Error Page로 넘어가는데 잘못된 부분을 찾을 수가 없어서 질문드립니다.이전 강의에서는 제대로 되었다가 안되었다가 했었는데 이제는 아예 Whitelabel로 넘어가버리네요 다음은 코드입니다.https://drive.google.com/file/d/1hLNHWRMH4_SYUxFWYiLkUdg7O6EEWKuy/view?usp=sharing
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
@RequestBody에 관해서 질문이요.
선생님, 스프1탄 MVC02의 35강을 보고나서 질문드려요.boardUpdate() Ajax에서 클라이언트가 적은 값을 변수 title, content에 초기화 하고, 그 값이 자바스크립트니까 JSON.stringfy로 JSON으로 변경해주고, 컨트롤러에서 @RequestBody로 그 JSON 값을 자바로 변환해서 비즈니스 로직을 해주고 있다.맞나요?근데 insertBoard() 에서도 클라이언트가 적은 값을 fData에 자바스크립트 문자열로 직렬화 해줬는데,어떻게 변환과정없이 비즈니스 로직이 실행되나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
spring 공부
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 김영한 선생님이번에 자바를 시작하고, 스프링을 공부하고자 하는 학생입니다.결론부터 말씀드리자면 spring 입문강의가 도저히 이해가 되지 않아서 공부방향에 대해 여쭙고 싶습니다.자바는 충분히 학습하여 어느정도 개념이 숙지되어있는 상태입니다. 그래서 spring을 공부하려고 입문편부터 보니, spring의 개념이 무엇인지, 구조가 어떻게 되는지, 모두 이해가 되지 않습니다. 제가 cs가 부족한 탓일까요? 혹은 기본편에서 모든 궁금증이 해결되는 것일까요? 일단 아직 이해는 가지 않은 채, 코드만 따라 적고있습니다. 어떻게 공부하면 좋을지 말씀 주시면 감사하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바, 스프링 버전 달라도 괜찮아요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]스프링 부트 버전이 3.3.2 로 하고 인텔리제이 얼티메이트 쓰고 있고 jdk 17버전으로 하는데 상관없나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV3_3Test 질문드립니다.
스프링AOP를 적용하려면 스프링컨테이너가 필요하다고 하셨는데, 그 이유가 프록시객체가 스프링빈으로 스프링컨테이너안에 있어야하고, 이를바탕으로 @Autowired MemberServiceV3_3 memberService; 여기에 스프링컨테이너에 있는 프록시객체의 스프링빈을 의존성주입 해주기위해 라고 이해하면 될까요?