묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP Dependence 문제
build.gradle랑 다 추가하고 업데이트해서 적용되게 했는데 오류가 나는데 어떻게 해야되나요? ㅜ=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
파일 실행이 안됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] HomeController.java 와 home.html을 다 작성하고 localhost:8080으로 실행하려고 하니 HomeController.java가 실행이 안됩니다. 인터넷에는 src를 리소스 루트로 지정하고 하면 된다고 해서 리소스 루트로 src를 지정하고 첫 번째 사진과 같이 파일 위치를 지정하는 부분에서 계속 없다고 뜨는데 어떻게 해야하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터 무한루프
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 해당 강의처럼 인터셉터 두개를 사용하여 요청을 했더니 인터셉터가 계속 호출되는 오류가 발생하였습니다. 오류의 원인은 LoginCheckInterceptor의 exclude pattern에 /login 경로를 추가하지 않아 발생한 것이었습니다. 교안과 비교하며 주먹구구식으로 해결하였지만 능동적으로 해결하기 위해서는 어떤 과정을 거쳐야 하나요? 처음에는 두 인터셉터에 브레이크포인트를 찍어 디버깅 하려 했지만 여러 복잡한 코드들을 마주하게 되더라구요.. 어떻게 이런 오류를 해결해야 하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
13분에 createQuery를 할려고 하는데 . qlString이 안 뜹니다 !
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
콘솔창에 warn이 안떠요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]콘솔창에 warn이 뜨지 않습니다. 스프링을 먼저 실행한 후에 http://localhost:8080/hello-mvc에 들어가서 오류가 나와도 콘솔창에 warn이 나오지 않습니다. 어떻게 해야할까요?
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
junit Test에서 오류는 나지 않지만 결과가 다르게 나오네요
안녕하세요 초기 egov에서 받을 때 최신인 5.3.6버전을 받아서 그런지 초기 DataSourceTest에서 @RunWith는 jUnit4버전을 가리키고 저는 5.3.6버전의 spring을 이용했어서인지 SpringJunit4ClassRunner.class가 import 되지 않아 난항을 겪던 중 pom.xml의 버전을 강사님처럼 5.0.7 RELEASE 버전으로 수정하면서 chat gpt의 도움을 받아 DataSourceTest의 테스트를 실행할 수 있었습니다. 그러나 console에서 연결이 되었다는 메세지도 없으며이를 이상하게 여기고 root-context.xml에 기입된 비밀번호를 강사님처럼 일부러 틀리게 한 후실패를 기대한 상태로 run을 돌렸지만, jUnit에 Failures가 뜨지도 않습니다..혹시 이런 경우에도 방법이 있을까 하여 코드도 함께 첨부합니다.. (pom.xml은 다른 글에 올려주신 참고 블로그의 것을 인용했습니다.) [pom.xml]=> 10000자를 올릴 수 없다하며 노션 링크를 첨부하겠습니다!https://devfighting.notion.site/18410212999180b5b0a9cd4ada3a6a58?pvs=4 [console결과, jUnit 결과] [maven dependencies]
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그아웃 구현시 memberId 값을 어떻게 가져오는건지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@PostMapping("/logout") public String logout(HttpServletResponse response){ expireCookie(response, "memberId"); return "redirect:/"; }로그아웃 구현시 expireCookie메소드를 생성 후 두번째 인자로 들어가는 memberId를 어떻게 가져오는건지 궁금합니다. logout메소드 생성시 인자로 추가한것도 아닌데 ..스프링컨테이너가 클라이언트에서 요청시 쿠키정보에 memberId라는 쿠키이름이 있으면 가져오게 되어있는건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Assertions에서 org.assertj.core.api가 안보입니다ㅜㅜㅜ
테스트 코드 작성중 Assertions에 org.assertj.core.api가 안보입니다 어떻게 해야되나요? ㅜㅜ=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle 빌드 오류
Execution failed for task ':test'.라고만 계속뜨네요인텔리제이도 다시 설치해봤는데...혹시 이메일을 알려주신다면 제가 project 파일을 보내드려도될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional을 붙여도 Rollback이 되지 않는 문제는 해결했으나 이유륾 모름
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]해결했습니다.복붙하는 과정에서private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); }이 부분이 있는 걸 몰랐네요 저는 conn = dataSource.getConnection() 으로 진행해서 문제가 생긴거였습니다 그런데 추가적인 질문으로 이렇게 했을 때는 롤백이 되지 않는 이유가 무엇인가요? 강의 코드와 똑같이 수정했음에도 롤백되지 않고 계속 DB에 반영이 됩니다. 참고로 다른 질문글의 conn 관련된 수정도 이미 했음에도 롤백되지 않습니다. JdbcMemberRepositorypackage hello.hello_spring.Repository; import hello.hello_spring.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; public class JdbcMemberRepository implements MemberRepository { // DB와 연동하려면 Datasource가 필요함 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 = dataSource.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; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if (rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while (rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } } SpringConfigpackage hello.hello_spring; import hello.hello_spring.Repository.JdbcMemberRepository; import hello.hello_spring.Repository.MemberRepository; import hello.hello_spring.Repository.MemoryMemberRepository; import hello.hello_spring.Service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class SpringConfig { private DataSource dataSource; @Autowired public SpringConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new JdbcMemberRepository(dataSource); } } MemberServiceIntegrationTestpackage hello.hello_spring.Service; import hello.hello_spring.Domain.Member; import hello.hello_spring.Repository.MemberRepository; import hello.hello_spring.Repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; // 테스트는 반복해서 시도할 수 있어야 하기 때문에 DB에 데이터를 인서트 쿼리하고 '롤백' 해주는 것 (정확히는 DB에 반영을 안하는 것) // 이를 위해서 @Transactional 사용 @SpringBootTest @Transactional class MemberServiceIntegrationTest { // 테스트는 특수한 용도이기 때문에 일회성(?)으로 필드 주입을 해도 무관 @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() { // given Member member = new Member(); member.setName("spring"); // when Long saveId = memberService.join(member); // then Member one = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(one.getName()); } @Test public void 중복_회원_예외() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> memberService.join(member2)); assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // try { // memberService.join(member2); // } catch (IllegalArgumentException e) { // assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // } // then } }
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Transactional 질문 있씁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 재직중인 직장 소스를 보면 트랜잭션을 걸어야하는 서비스단 메서드에 @Transactional의 격리 수준이 READ UNCOMMITTED 로 모두 되어있습니다. 하나도 빠짐없이.. 상사분의 말로는 테이블 락 발생을 방지하기 위해 이렇게 한다는데... 영한님의 의견이 궁금합니다. 제가 생각했을때 이는 적합하지 않은 방법같거든요. 정합성이 깨질뿐더러 테이블 락은 다른 방법으로 해결해야지 이건 아닌것 같더라구요.. 답변 기다리겠습니다!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
try-with-resources 구문 사용 관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]해당 강의에서는 save(Member member)를 작성하면서 try-catch구문을 썼는데 아래처럼 try-with-resources구문을 사용하면 생길 수 있는 문제가 있어서 try-catch구문을 쓰는건가요?try (Connection con = getConnection(); PreparedStatement pstmt = con.prepareStatement(sql)) { pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney()); pstmt.executeUpdate(); return member; } catch (SQLException e) { log.error("db error", e); throw e; }제가 혼자 생각해봤었을 때의 이때의 생길 수 있는 문제점은 try(...)안의 자원들의 close()가 호출될 때가 아닌 생성될 때의 오류가 생기면 그걸 catch로 잡거나 그러지 못할수도 있다는 것이었습니다.실제로 h2데이터베이스를 끄고 실행해봤었을 때,Connection con = getConnection(); 부분에서 예외가 발생했고, catch로 잡지 못하는 모습이었습니다. 이처럼 자원 생성에서부터 예외가 발생할 때 try-with-resources를 사용하는 것은 적절치 않다고 생각하면 되는걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
assertj 에 해당하는 Assertions 이 import가 상단에 되지 않는이
[질문 내용]ctrl + enter 를 해도 import가 상단에 안되는데 어떻게 해결을 해야할까요? junit 의 Assertions 만 import가 잘됩니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 부분에서 오류가 납니다.
빌드 부분에서 오류가 납니다.JAVA버젼도 21버젼으로 다시설치했고 경로에 한글도 없는데 왜일까요?답변 부탁드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오류페이지 404 화면 안나옴
package hello.exception.servlet; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import java.io.IOException; @Slf4j @Controller public class ServletExController { @GetMapping("/error-ex") public void errorEx() { throw new RuntimeException("예외발생"); } @GetMapping("/error-404") public void send404Error(HttpServletResponse response) throws IOException { response.setStatus(404); // 상태 코드 설정 response.getWriter().write("404 오류 발생"); } @GetMapping("/error-500") public void send500Error(HttpServletResponse response) throws IOException { response.setStatus(500); // 상태 코드 설정 response.getWriter().write("500 오류 발생"); } } 이렇게 400오류일 때 페이지를 설정해도 error-404로 들어가면 오류가 발생하고 error-400에 들어가면 404 화면이 나옵니다.application.properties는 이렇게 구성되어있고, html파일은 수업 자료 코드 그대로 가져왔습니다.확인 한번 해주시면 감사하겠습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
localhost:8080 접속시 로그인
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 localhost:8080 입력했는데로그인 하라고 떠서요.. 혹시 뭐가 잘못된걸까요....?오늘 인텔리제이는 처음 설치해서 사용중이고원래는 sts3을 사용했었습니다..!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 오픈 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.build.gradle 오픈하니까 이런 에러가 뜹니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
프로젝트설정 6분경
자바 23버전으로 스프링사이트에서 다운받고 위처럼 설정하였습니다 run한결과 체크표시는 안뜨고 계속 로딩중 마크로 뜨고 있습니다. 하지만 localhost:8080으로 들어가면 잘 나오긴합니다. 실행멈춤을 하면 밑에 처럼 나옵니다 특별하게 문제 될건 없을까요? 원인은 무엇일까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
InitBinder 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]복습겸 개인 프로젝트를 하고 있는데요, 로그인과 회원가입을 각각 검증기를 넣어주려고 하는데, 두 가지 검증기를 넣으니 다른 한 쪽에서는 오류가 발생합니다. 예를 들어, 로그인 페이지에 들어갈 경우에는 java.lang.IllegalStateException: Invalid target for Validator [com.weblibrary.domain.user.validation.JoinValidator@135416b2]: LoginUserDto(username=null, password=null) 이런 식입니다. supports에 해당하지 않으면 무시하는 게 아니라, 예외가 발생하는 걸까요? 이런 경우 어떻게 해결하는 게 좋을까요? package com.weblibrary.domain.user.controller; import com.weblibrary.domain.user.model.JoinUserDto; import com.weblibrary.domain.user.model.LoginUserDto; import com.weblibrary.domain.user.model.User; import com.weblibrary.domain.user.service.UserService; import com.weblibrary.domain.user.validation.JoinValidator; import com.weblibrary.domain.user.validation.LoginValidator; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; /** * 유저 회원가입 컨트롤러, GET, POST에 따라 다르게 동작. */ @Controller @RequiredArgsConstructor @Slf4j public class AccountController { private final UserService userService; private final LoginValidator loginValidator; private final JoinValidator joinValidator; @InitBinder public void initLoginBinder(WebDataBinder dataBinder) { dataBinder.addValidators(loginValidator); dataBinder.addValidators(joinValidator); } /* join form 보여주기 */ @GetMapping("/join") public String joinForm(Model model) { model.addAttribute("user", new JoinUserDto()); return "home/join"; } /* 회원가입 처리하기 */ @PostMapping("/join") public String join(@Validated @ModelAttribute("user") JoinUserDto user, BindingResult bindingResult) { log.debug("objectName={}", bindingResult.getObjectName()); log.debug("target={}", bindingResult.getTarget()); log.debug("Input User DTO: {}", user); if (bindingResult.hasErrors()) { log.debug("errors={}", bindingResult); return "home/join"; } // 회원가입 후에 홈으로 리다이렉트 return "redirect:/"; } @GetMapping("/login") public String loginForm(Model model) { model.addAttribute("user", new LoginUserDto()); return "home/login"; } /* 로그인 처리하기 */ @PostMapping("/login") public String login(@Validated @ModelAttribute("user") LoginUserDto user, BindingResult bindingResult) { log.debug("objectName={}", bindingResult.getObjectName()); // loginUserDto로 나오고 있었다. @ModelAttribute("user")로 해결 log.debug("target={}", bindingResult.getTarget()); // 정상적으로 LoginUserDto 인스턴스를 찾아옴. log.debug("Input User DTO: {}", user); if (bindingResult.hasErrors()) { log.debug("errors={}", bindingResult); return "home/login"; } // 로그인 후에 홈으로 리다이렉트 return "redirect:/"; } @PostMapping("/signout") public ResponseEntity<String> signOut(HttpSession session) { User user = (User) session.getAttribute("user"); log.debug("login user={}", user); if (user == null) { return new ResponseEntity<>("로그인되지 않았습니다.", HttpStatus.FORBIDDEN); } session.setAttribute("user", null); return new ResponseEntity<>("로그아웃 되었습니다.", HttpStatus.OK); } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
./gradlew build 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용].\gradlew build를 했더니 오류가 떠요PS C:\Users\chyt7\OneDrive\바탕 화면\study\hello-spring> .\gradlew build> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/chyt7/OneDrive/%EB%B0%94%ED%83%95%20%ED%99%94%EB%A9%B4/study/hello-spring/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 2s7 actionable tasks: 1 executed, 6 up-to-date