묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
properties의 유용성에 대해 질문드립니다
FieldError 생성자의 @Nullable String[] codes의 인자 작성시properties를 통해 메세지를 한눈에 관리한다는 점은 좋지만인텔리제이 ultimate를 씀에도 자동완성도 지원이 안되고, 잘못된 메세지 코드를 입력했을 때 컴파일 과정에서 오류가 발생하지 않는데 이게 꼭 좋은 방법인가요?특정 메세지를 담고있는 클래스를 생성하고 해당 클래스 내에 메세지 필드를 적어놓는다면 이런 문제는 해결할 수 있을거 같은데왜 properties를 통해 메세지를 관리하는지 궁금합니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Servlet 호출 안되는 문제 발생
안녕하세요, 강의를 수강하는 학생입니다. <문제 상황>이때까지 강의를 잘 따라오다가 갑자기 뷰 리졸버를 위해 OldController 클래스를 작성하고 properties도 수정했는데 뷰가 제대로 나오지 않았습니다. 그래서 문제를 찾다가 애초에 servlet도 호출이 잘 안되는거 같아서 다시 스프링 프로젝트 파일을 생성하여 이전에 배운 프레임워크를 간단하게 다시 구현하고 실행을 했습니다만, 여전히 문제가 발생합니다. 어떻게 해결해야 할지 모르겠습니다. *수정 : 확인을 다시해보니, 서블릿은 정상적으로 호출이 되며, viewPath도 잘 만들어지고 view 객체 클래스의 render 메서드까지 잘 도달했지만, foward 메서드 실행 후에 계속 같은 문제가 발생하고 있습니다. 꼭 좀 도와주세요!! (강의를 듣고 싶습니다 ㅠㅠ) <문제 코드>깃허브에 코드를 올려놓았습니다.주소 : https://github.com/bread-Cat13/mvc1/tree/main/mvc/src/main/java/com/example/mvc<문제 사진> 혼자서 해결해보고자 했지만 잘 안되어 질문드립니다. 많은 정보를 작성해놓지 않아 죄송합니다.질문글 읽어주셔서 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
REQUIRES_NEW와 내부 호출
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]내부 호출 문제점은 REQUIRES_NEW 어노테이션이 적용된 경우에도 동일하게 발생하는 것 같은데 맞을까요?? 아래 코드를 실행했을 때 커밋이 한 번도 발생하지 않는 것을 로그로 확인했습니다. 혹시나 해서 여쭤봅니다!! @Slf4j @SpringBootTest public class InternalCallV1Test { @Autowired CallService callService; @Test void externalCall() { callService.external(); } @TestConfiguration static class InternalCallV1TestConfig { @Bean CallService callService() { return new CallService(); } } @Slf4j static class CallService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void internal() { log.info("call internal"); printTxInfo(); } @Transactional public void external() { log.info("call external"); printTxInfo(); this.internal(); throw new RuntimeException("종료"); } private void printTxInfo() { boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active={}", txActive); } } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
복사붙여넣기 어디에 하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]7분28초에 어마어마한 코드를 복사붙여넣기를 한다고 했는데 어디에다가 붙여놓는걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
코드 복사 붙여넣기가 너무 많아서 어디꺼를 가지고 와야하는데 좀더 설명해주세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]순수 JDBC 를 공부 중인데 너무 복사붙여넣기가 많고 화면을 멈춰도 빨라요...어디꺼를 가지고 와야 붙여넣기를 해도 오류가 안생길까요?ㅜㅜpackage com.example.springpractice.repository; import com.example.springpractice.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; import static java.sql.DriverManager.getConnection; import static org.apache.tomcat.util.descriptor.InputSourceUtil.close; public class JdbcMemberRepository implements MemberRepository { private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } //저장 @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; } @Override public Optional<Member> findByName(String name) { return Optional.empty(); } @Override public List<Member> findAll() { return List.of(); } }
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
SQLexception 질문
체크예외인 SqlException의 문제점을 리포지토리 레벨에서 런타임 예외로 바꾸어 유지보수성을 향상시킨다고 생각했습니다.여기서 드는 생각은, 애초에 자바 진영(?) JDBC측에서 sqlException 자체를 언체크로 다시 설계해서 내뿜도록 하면 되지 않나요? 결국 예외가 발생하는 가장 처음 부분에서 잡는 것이지만 Jpa exception이 올라온다면 이를 또 바꾸어줘야 하는데 애초에 체크였던 sql,jpa exception을 언체크로 뿌려지게끔 하지 않는 이유를 모르겠습니다.체크는 꼭 인지해서 처리해야할 예외를 체크로 만든다고 했는데 사실상 처리하기 어려운 예외로 굳어져서 코드들만 유지보수성을 떨어뜨리는 체크예외를 라이브러리를 만든 측에서 언체크로 바꾸어주면 안되나 싶었습니다.제가 어떤 이해가 부족할까요... 아마도 언체크 예외로 바꾼다면 발생할 문제들이 존재할 것 같은데. (이전에 배운 exceptionHandler가 언체크를 못잡는 것도 아닌데 말이죠)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
run 실행버튼이 아예 뜨지않습니다. ㅠㅠ
HelloSpringApplication 실행에서 초록색 > 버튼으로 run (실행)하는 창이 뜨지 않습니다.. ㅠㅠ 강의대로 따라했는데, 여기서 진도를 못나가고있어요 ㅠ 마우스를 갖다대도 뜨지않습니다. 김영한강사님 자바 입문편 볼때는 > run 버튼이 잘떳는데 왜 spring에선 강의영상처럼 안뜰까요 ㅠㅠ?=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
FieldError의 bindingFailure 질문
FieldError의 bindingFailure에 바인딩이 실패했는지 여부를 적어주고 영한님은 false를 입력해주셨는데요 충분히 사용자가 가격에 1111 대신 qqq를 작성할 수 있는데, 왜 false가 들어오는것인가요? 즉, 사용자가 타입에 맞는 폼을 작성하는지 안하는지 개발자 입장에서 알 수 없는 노릇인데, false/true중 하나를 입력한다는 것이 이해가지 않습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSON으로 리턴하는 경우에도 MVC인가요?
저는 대략적으로 컨트롤러에서 view를 리턴해주는 경우 SSR, restful api를 사용해 json을 리턴해주는 경우 CSR이라고 이해하고있습니다그런데 json을 리턴해주는 경우, 컨트롤러에서 모델을 따로 사용하지 않고, 뷰를 리턴해주는것도 아닌데 이 경우에도 여전히 MVC 패턴을 사용한다고 말할 수 있는지 궁금합니다
-
미해결스프링 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등등 데이터 접근 기술들을 알려주셔서 해당 구현체들을 추상화 목적으로 만드신건가요?? 아니면 현업에서는 일반적으로 영한님처럼 파일 구조로 만드나요??