inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

Assertions에서 org.assertj.core.api가 안보입니다ㅜㅜㅜ

미해결

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

테스트 코드 작성중 Assertions에 org.assertj.core.api가 안보입니다 어떻게 해야되나요? ㅜ ㅜ ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.

  • spring
  • mvc
상준 댓글 1 좋아요 0 조회수 109

gradle 빌드 오류

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

Execution failed for task ':test'. 라고만 계속뜨네요 인텔리제이도 다시 설치해봤는데...혹시 이메일을 알려주신다면 제가 project 파일을 보내드려도될까요?

  • java
  • spring
  • mvc
  • spring-boot
전우영 댓글 2 좋아요 0 조회수 247

@Transactional을 붙여도 Rollback이 되지 않는 문제는 해결했으나 이유륾 모름

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 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 관련된 수정도 이미 했음에도 롤백되지 않습니다. JdbcMemberRepository package 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); } } SpringConfig package 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); } } MemberServiceIntegrationTest package 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 } }

  • java
  • spring
  • mvc
  • spring-boot
Dongni 댓글 1 좋아요 0 조회수 134

Transactional 질문 있씁니다.

미해결

스프링 DB 1편 - 데이터 접근 핵심 원리

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 현재 재직중인 직장 소스를 보면 트랜잭션을 걸어야하는 서비스단 메서드에 @Transactional의 격리 수준이 READ UNCOMMITTED 로 모두 되어있습니다. 하나도 빠짐없이.. 상사분의 말로는 테이블 락 발생을 방지하기 위해 이렇게 한다는데... 영한님의 의견이 궁금합니다. 제가 생각했을때 이는 적합하지 않은 방법같거든요. 정합성이 깨질뿐더러 테이블 락은 다른 방법으로 해결해야지 이건 아닌것 같더라구요.. 답변 기다리겠습니다!

  • spring
  • mvc
  • spring-jdbc
backendman 댓글 1 좋아요 0 조회수 153

성능 최적화에서 쿼리 횟수 줄이는 것이 가장 중요한 것인가요?

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의 내용에서 계속해서 쿼리 횟수를 줄이는 방향으로 확장시키시는데 일반적으로 db에 sql문 날리는 횟수를 줄이는 것이 가장 중요한 것이 맞을까요? 극적으로, db에 간단한 sql문 2번 날리기 vs 조인 많은 sql문 1번 날리기 하면 후자가 더 성능이 좋은지 여쭙니다. 물론 상황에 따라 다르겠지만 일반적인 상황을 가정하여 답해주시면 감사할 것 같습니다. 일반적으로 db 네트워크 비용때문에 후자가 더 좋은게 맞을까요?

  • java
  • spring
  • spring-boot
  • jpa
조준범 Justin 댓글 1 좋아요 0 조회수 183

try-with-resources 구문 사용 관련 질문드립니다.

해결됨

스프링 DB 1편 - 데이터 접근 핵심 원리

[질문 템플릿] 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를 사용하는 것은 적절치 않다고 생각하면 되는걸까요?

  • spring
  • mvc
  • spring-jdbc
문예찬 댓글 2 좋아요 0 조회수 195

리눅스 서버에 대한 질문입니다.

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

스프링부트를 배포하는것을 검색하다보면 apache2.4를 서버에 설치 하는 것을 많이 본 거 같은데, 지금 도서관리 서비스는 정적인 서비스라 아파치가 필요 없는 걸까요?? 아니면 사용할 필요가 없는거 일까요?? 궁금합니다..

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
지루한 하마 댓글 1 좋아요 1 조회수 92

db로 mariaDB가아니라 MySQL을 사용해도 괜찮을까요?

미해결

3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]

db로 mariaDB가아니라 MySQL을 사용해도 괜찮을까요? 제목 그대로입니다.

  • spring
  • 전자정부프레임워크
남영 댓글 1 좋아요 0 조회수 151

event, study 참조

미해결

스프링과 JPA 기반 웹 애플리케이션 개발

강의 잘 듣고 있습니다! 현재 Event에서 다대일로 study를 단방향으로 참조하고있는데 스터디 모집시에 event쪽이 삭제되지 않아 버그가 생깁니다. 해결법으로는 2가지 생각해봤는데요. 양방향관계로 변경 후 Cascade사용 단방향으로 유지하지만 스터디종료 메서드에서 event를 수동으로 remove처리 1번 방법으로는 엔티티 설계 구조가 깨지니까 2번방법이 나으려나요. 고민이됩니다. 이런 참조 문제가 더 생길것을 방지해 양방향 관계로가는게 더 유연할지가 고민입니다. 아니면 초기설계목표상 모임이 하나라도 존재하면 스터디가 삭제되면안되는것인가요?

  • java
  • spring
  • spring-boot
  • jpa
  • thymeleaf
이승혁 댓글 2 좋아요 0 조회수 262

회원가입 테스트 Rollback(false) 설정 했는데 h2 db에 데이터 없음.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

===================================== [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 회원가입 테스트 시 Rollback(false)를 설정하고 실행은 정상적으로 되고 log에서도 insert 된 것을 확인할 수 있는데, h2 db 에서는 데이터가 들어와있지 않습니다. 왜 그런걸까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
jamong9669 댓글 2 좋아요 0 조회수 227

assertj 에 해당하는 Assertions 이 import가 상단에 되지 않는이

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 내용] ctrl + enter 를 해도 import가 상단에 안되는데 어떻게 해결을 해야할까요? junit 의 Assertions 만 import가 잘됩니다.

  • java
  • spring
  • mvc
  • spring-boot
kabsung lee 댓글 3 좋아요 0 조회수 349

anonymousAuthenticationFilter 와 AuthorizationFilter 의 로직 순서

미해결

스프링 시큐리티 완전 정복 [6.x 개정판]

SecurityFilterChain 의 순서를 보면 AnonymousAuthenticationFilter 가 먼저이고 AuthorizationFilter 가 맨 마지막에 실행되는 것을 확인했습니다. Anonymous 강의에서 AnonymousAuthenticaionFilter는 authentication이 null 인 경우 AnonymousAuthenticaionToken을 생성하여 익명 사용자로 처리한고 Authentication이 null이 아닌 경우 doFilter()로 다음필터로 넘어간다고 하셨는데. 오늘 강의를 보니 anonymousAuthenticationFilter 에는 authenticaion 이 있는지 확인을 하지 않고 authorizationFilter 에서 getContext().getAuthentication() 을 통해 유무를 확인후 없다면 다시 AnonymousAuthenticationFilter 를 통해 AnonymousAuthenticationToken을 생성시켜 할당하는 것 처럼 보이는데 맞을까요? 즉 anonymousAuthenticationFilter doFilter() --> AuthorizationFilter getAuthentication() --> anonymousAuthenticationFilter에서 생성

  • spring
  • spring-boot
  • spring-security
  • security
  • web-security
노동준 댓글 1 좋아요 0 조회수 138

빌드 부분에서 오류가 납니다.

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

빌드 부분에서 오류가 납니다. JAVA버젼도 21버젼으로 다시설치했고 경로에 한글도 없는데 왜일까요? 답변 부탁드립니다.

  • java
  • spring
  • mvc
  • spring-boot
전우영 댓글 2 좋아요 0 조회수 197

오류페이지 404 화면 안나옴

미해결

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

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파일은 수업 자료 코드 그대로 가져왔습니다. 확인 한번 해주시면 감사하겠습니다.

  • spring
  • mvc
장주윤 댓글 2 좋아요 0 조회수 282

localhost:8080 접속시 로그인

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 localhost:8080 입력했는데 로그인 하라고 떠서요.. 혹시 뭐가 잘못된걸까요....? 오늘 인텔리제이는 처음 설치해서 사용중이고 원래는 sts3을 사용했었습니다..!!

  • java
  • spring
  • mvc
  • spring-boot
닉네임 댓글 2 좋아요 0 조회수 455

프로젝트 오픈 에러

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 여기에 질문 내용을 남겨주세요. build.gradle 오픈하니까 이런 에러가 뜹니다.

  • java
  • spring
  • mvc
  • spring-boot
a000626 댓글 2 좋아요 0 조회수 495

Downstream Mono, Flux가 subscriber인가요?

미해결

Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부

안녕하세요! 마블 다이어 그램을 보면 upstream Flux나 Mono는 코드상 Flux.just(), Mono.just()를 통해 직관적으로 생산자로 이해가 되는데! Downstream Flux, Mono는 무엇을 의미하는지 이해가 가지 않습니다. Subscriber라고 보면 될까요? 좋은 강의 감사합니다.^^

  • java
  • spring
  • project-reactor
  • webflux
가보자!! 댓글 1 좋아요 0 조회수 183

프로젝트설정 6분경

미해결

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

자바 23버전으로 스프링사이트에서 다운받고 위처럼 설정하였습니다 run한결과 체크표시는 안뜨고 계속 로딩중 마크로 뜨고 있습니다. 하지만 localhost:8080으로 들어가면 잘 나오긴합니다. 실행멈춤을 하면 밑에 처럼 나옵니다 특별하게 문제 될건 없을까요? 원인은 무엇일까요?

  • spring
  • mvc
peter 댓글 2 좋아요 0 조회수 202

InitBinder 질문드립니다.

해결됨

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 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); } }

  • spring
  • mvc
김철준 댓글 2 좋아요 0 조회수 127

헥사고날 아키텍처 질문 있습니다.

미해결

Practical Testing: 실용적인 테스트 가이드

학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. jpa와 너무 강하게 결합되어 있어 repository 인터페이스를 만든다고 하셨는데 그러면 1. repository 인터페이스 2. 1의 repository 인터페이스를 구현한 repositoryimpl 3. 2의 repositoryimpl에서 사용할 jparepository 이렇게 세 개나 만들어서 사용하는건가요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
eoyeong 댓글 2 좋아요 0 조회수 153

인기 태그

인프런 TOP Writers

주간 인기글