묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Java/Spring 주니어 개발자를 위한 오답노트
의존성 주입에서 파라미터 주입과 필드 주입 관련 질문 드립니다.
안녕하세요 강사님 좋은 강의 감사드립니다.의존성 주입의 예시가 Chef의 멤버 변수에 대한 의존성 주입 예시라고 이해했는데 파라미터 주입 예시 코드에서 Chef의 멤버변수에 값을 넣어주는 코드가 없는거 같아서 잘 이해가 되지 않아 질문드립니다. 강사님께서 7분 34초에 setter와 멤버 변수를 이용해서 받는 필드 주입이 있다고 하셨는데 제가 다른 래퍼런스를 찾아본 결과 강사님께서 설명해주신 부분을 setter 주입이라고 하고 필드 주입은 @Autowired 어노테이션을 통한 주입이라고 설명하더라고요 그래서 이 부분에서 혼동이 생겨 질문 드립니다.
-
미해결스프링 기반 REST API 개발
java.lang.AssertionError: Status
안녕하세요 기선님의 강의를 보면서 스프링부트 3.x버전때로하고있는데 에러 발생되어서 문의드립니다..답글에 소스코드 올렸습니다..첫번째는 메이븐에서 <version>2.3.1</version> 을 입력 하는 경우 해당 지원 라이브러리가 지원이 안되는 경우가발생하는데 왜그러는걸까요?..두번째는 예제보고 따라하는데..아래와 같은 오류가 발생합니다..이건 왜그러는것일까요??<오류>MockHttpServletRequest:HTTP Method = POSTRequest URI = /api/events/Parameters = {}Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/hal+json", Content-Length:"403"]Body = {"id":10,"offline":false,"free":false,"eventStatus":null,"name":"Spring","description":"REST API Development with Spring","beginEnrollmentDateTime":"2018-11-23T14:21:00","closeEnrollmentDateTime":"2018-11-24T14:21:00","beginEventDateTime":"2018-11-25T14:21:00","endEventDateTime":"2018-11-26T14:21:00","location":"강남역 D2 스타텁 팩토리","basePrice":100,"maxPrice":200,"limitOfEnrollment":100}Session Attrs = {}Handler:Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandlerAsync:Async started = falseAsync result = nullResolved Exception:Type = org.springframework.web.servlet.resource.NoResourceFoundExceptionModelAndView:View name = nullView = nullModel = nullFlashMap:Attributes = nullMockHttpServletResponse:Status = 404Error message = No static resource api/events.Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers"]Content type = nullBody =Forwarded URL = nullRedirected URL = nullCookies = []MockHttpServletRequest:HTTP Method = POSTRequest URI = /api/events/Parameters = {}Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/hal+json", Content-Length:"403"]Body = {"id":10,"offline":false,"free":false,"eventStatus":null,"name":"Spring","description":"REST API Development with Spring","beginEnrollmentDateTime":"2018-11-23T14:21:00","closeEnrollmentDateTime":"2018-11-24T14:21:00","beginEventDateTime":"2018-11-25T14:21:00","endEventDateTime":"2018-11-26T14:21:00","location":"강남역 D2 스타텁 팩토리","basePrice":100,"maxPrice":200,"limitOfEnrollment":100}Session Attrs = {}Handler:Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandlerAsync:Async started = falseAsync result = nullResolved Exception:Type = org.springframework.web.servlet.resource.NoResourceFoundExceptionModelAndView:View name = nullView = nullModel = nullFlashMap:Attributes = nullMockHttpServletResponse:Status = 404Error message = No static resource api/events.Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers"]Content type = nullBody =Forwarded URL = nullRedirected URL = nullCookies = []java.lang.AssertionError: StatusExpected :201Actual :404<Click to see difference>at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122)at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:637)at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)at com.example.wrpi.global.events.EventControllerTest.createEvent(EventControllerTest.java:59)at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)at java.base/java.lang.reflect.Method.invoke(Method.java:578)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:76)at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)Process finished with exit code -1
-
미해결토비의 스프링 6 - 이해와 원리
섹션3 학습테스트 시간 비교테스트 질문입니다.
섹션3의 학습테스트 과정 중 서로 다른 시간에 생성된 두 개의 Clock systemDefaultZone() 값을 isAfter() 로 비교 테스트 하는 중 아래와 같은 오류가 발생됩니다.검색해보니 같은 문제를 겪고 있는 분들께서 WorkAround로 테스트 안정성을 높이기 위해 ChronoUnit.SECONDS 형태와 같이 초 단위까지만 비교하여 같은지 여부를 확인하거나,Fixed Clock으로 시간을 수동으로 지정하여 검증하는 테스트 방법을 권장하고 있었습니다.참고 사이트 :https://velog.io/@weightle55/%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%98%81%EC%97%AD%EC%9D%84-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B3%A0-%EB%B6%84%EB%A6%AC%ED%95%98%EA%B8%B0강사님께서는 테스트를 바로 통과하셨는데, 차이가 무엇인지 궁금합니다.
-
미해결토비의 스프링 6 - 이해와 원리
공부한 내용을 개인 블로그에 정리해서 올려도 될까요?
안녕하세요 토비님. 우선 좋은 강의 부탁드립니다. 토비의 스프링 3.1 책으로 처음 토비님 알게되었는데, 강의도 찍으신 줄 모르고있다가 오늘 바로 구매하고 듣기 시작했습니다.다름이 아니라, 강의 내용을 개인 블로그 등에 정리해서 올려도 될까요? 일부 강의 내용 스크린샷 찍어서 올리는 건 허용되는지 궁금합니다.좋은 강의 해주셔서 감사합니다! 개인적으로 스프링에 국한되지 않은 강의도 찍어서 올려주시길 희망합니다! 경험하신 서비스들의 시스템 디자인이나, MSA 구조나, 대규모 트래픽을 받을 때 캐시나 DB설계 등등.. 토비님의 짱짱한 경력과 경험에서 오는 내용이라면, 도움이 정말 많이 될 것 같아요. 앞으로도 많은 강의활동 부탁드립니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
type=Internal Server Error, status=500
error 500이면 코드가 잘못된 거 같은데 어디가 잘못 됐는지 봐주실 수 있을까요🥺HelloControllerpackage com.example.hello_spring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model){ model.addAttribute("data", "hello!"); return "hello"; } @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name){ return "hello" + name; } jdbcMemberRepositorypackage com.example.hello_spring.repository; import com.example.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 { 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; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = 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 = 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 = 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 Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } 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); } }콘솔창 오류메시지 2024-07-20T10:30:05.545+09:00 ERROR 17396 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection] with root cause
-
미해결스프링 핵심 원리 - 기본편
DiscountPolicy null 문제
java.lang.NullPointerException: Cannot invoke "hello.core.discount.DiscountPolicy.discount(hello.core.member.Member, int)" because "discountPolicy" is null문제가 발생합니다.DIscountPolicy 를 구현한 클래스에 @Component 와 우선순위 등.. 다 했다고 생각하는데 어디서 오류가 나는지 찾을 수 없어 도움을 요청합니다.https://drive.google.com/file/d/18SR0aSD0XoEpUCw3Te4wP0r_23TViNC0/view?usp=sharing
-
미해결토비의 스프링 6 - 이해와 원리
스프링 순서 질문드려요,,
안녕하세요 토비님!! 라이브 영상이 너무 좋아서 바로 스프링 6 구매했는데요! 제가 궁금한 게 저는 자바만 열심히 판 상태이고 스프링이 처음이며 내년 상반기에는 토이프로젝트를 시도해야하는 상황입니다. 혹시 스프링 6 듣고 스프링 부트 원리를 들어야 할까요? 아니면 바로 스프링부트로 직접 프로젝트 만들어보면 될까요? 제일 좋은 건 둘 다..이겠지만 혹시라도 필수인지 궁금해서 여쭤봅니다. 그리고 번외로 강의가 진짜 몰입력 있어요!! 감사하게 보겠습니다!! ㅎㅎ
-
미해결스프링 부트 - 핵심 원리와 활용
강의를 따라했는데 매핑 정보가 등록되지 않은 것 같습니다.
public interface AppInit { void onStartup(ServletContext servletContext); } /** * 서블릿 컨테이너 모방 * 프로그래밍 방식을 서블릿 컨테이너에 등록 */ public class AppInitV1Servlet implements AppInit { @Override public void onStartup(ServletContext servletContext) { System.out.println("AppInitV1Servlet.onStartup"); // 순수 서블릿 코드 등록 ServletRegistration.Dynamic helloServlet = servletContext.addServlet("helloServlet", new HelloServlet()); helloServlet.addMapping("/hello-servlet"); } }/** * 서블릿 그 자체 * 애플리케이션 초기화 */ public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloServlet.service"); resp.getWriter().println("hello servlet!"); } }hello.container.MyContainerInitV1 hello.container.MyContainerInitV2 이런식으로 강의를 따라 서블릿에 매핑 정보를 등록했는데, http://localhost:8080/hello-servlet을 하게 되면 404 에러가 발생합니다. 어디서 문제가 생긴걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
aop 실행에 대한 이해가 안됩니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.MemberService에서 try/finally및 변수만 설정 해줬을 뿐인데왜 실행은 test->MemberServiceIntegration이 아니라HelloSpringApplication으로 실행을 해야 결과가 나타나게 되나요? 굳이 차이를 못느끼겠는데 왜 그런지 이해가 안가네요
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 강의에서 만든 hello-spring 파일과 IntelliJ관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 IntelliJ에서 프로젝트 파일들을 다루는 부분이 아직 미숙하여 질문드립니다. 1강을 들으면서 실행했을 때는 강의에서 생성한 hello-spring 프로젝트를 상위 폴더인 spring에 담고 spring 폴더로 IntelliJ를 열어서 실행했습니다. 이때는 정상적으로 실행이 되었는데, 다시 실행하려고 보니 실행이 안 됩니다. 다시 다운로드 받고 검색을 해봤지만, 설정에서 idk와 grade관련된 설정만 나왔습니다. 그런데 상위 폴더인 spring이 아닌 spring 프로젝트로 생성한 hello-spring으로 IntelliJ를 실행시키니 정상적으로 폴더들(패키지들)을 인식하고 실행이 됩니다. 원래 이렇게 작동하는 것이 맞는건지 제가 설정 부분을 잘못 건드려서 발생한 문제인지 궁금합니다.
-
미해결토비의 스프링 6 - 이해와 원리
트랜잭션 테스트에서 제가 이해한 것이 맞을까요?
트랜잭션 테스트가 어려운 이유는 JPA나 JDBC에서 알아서 처리해주기 때문에 트랜잭션의 실패 지점이 어디인지를 알 수 없기 때문이고, 이를 해결하려면 트랜잭션 템플릿을 활용하는 방법이 있는 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
member 1, 2 중복 회원 예외 test
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]member 1, 2가 spring으로 동일한데 해당 코드를 실행하면 초록색 표시로 test가 통과하는데 이렇게되면 중복 문제 확인은 어떻게 하나요? 강의를 잘못 이해한 걸까요,,,
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@{/css/bootstrap.min.css}
templates에 item.html을 타임리프를 적용하는데<link href="../css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"> 강의에 나온 코드에서 왜 th:href="@{../css/bootstrap.min.css}"으로 상위 경로로 가지 않아도 작동하는 이유가 뭔가요?그리고 이상하게 th:href="@{../css/bootstrap.min.css}"으로 하면 적용이 안되는 이유와 관련이 있나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.gradlew build가 제대로 되지 않습니다.
-
미해결스프링 핵심 원리 - 기본편
404 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
itemService 테스트 코드 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ItemService 테스트 코드입니다.@RunWith(SpringRunner.class) @SpringBootTest @Transactional public class ItemServiceTest { @Autowired ItemRepository itemRepository; @Autowired ItemService itemService; @Test public void 상품저장() throws Exception { //given Item item = getItem("JPA book", 10000, 100); itemService.save(item); //when Item findItem = itemService.findById(item.getId()); //then // assertThat(item).isEqualTo(findItem); assertEquals(item, findItem); } @Test public void 상품조회() throws Exception { //given Item item1 = getItem("JPA book1", 10000, 100); Item item2 = getItem("JPA book2", 20000, 100); itemService.save(item1); itemService.save(item2); //when List<Item> findAll = itemService.findAll(); Item findItem1 = itemService.findById(item1.getId()); //then assertThat(findAll.size()).isEqualTo(2); //전체조회 assertThat(item1).isEqualTo(findItem1); //단건조회 } @Test public void 상품변경() throws Exception { //given //when //then } private static Item getItem(String name, int price, int stockQuantity) { Item item = new Book(); item.setName(name); item.setPrice(price); item.setStockQuantity(stockQuantity); return item; } }상품 저장과 조회에 대한 테스트 코드를 작성해보았는데 혹시 수정해야 할 부분이 있는지 궁금합니다.상품 저장 시 item.getId() == null 이 아닐 때 merge 하도록 되어있는 부분에 대해서도 테스트를 해야할 것 같은데, 어떻게 테스트할지에 대해 방향성을 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 오류 질문
회원 기능 테스트에서 계속 막혀서 전부 다 복붙하고 해봐도 오류가 납니다 이거 왜이런걸까요? 우선 프로젝트 전체 구글 드라이브에 공유해뒀습니다.https://drive.google.com/file/d/1jEOFgnIZ2fRBWTDKmYaA3lnrid-0i10E/view?usp=drive_link
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이런 코드 유형?은 어디편에서 공부해야하나요?
public class GuestBookMapper { public static GuestBookDTO toDTO(GuestBook entity) { return GuestBookDTO.builder() .guestBookId(entity.getGuestBookId()) .content(entity.getContent()) .nickName(entity.getNickName()) .reportedCount(entity.getReportedCount()) .createDate(entity.getCreateDate()) .pw(entity.getPw()) .build(); } public static GuestBook toEntity(GuestBookRequest dto) { return GuestBook.builder() .content(dto.getContent()) .nickName(dto.getNickName()) .createDate(LocalDateTime.now()) .reportedCount(0) .pw(dto.getPw()) .build(); } } 프로젝트 진행중 다른분 코드를 공부하다가 Mapper이란 클래스는 왜있고 builder는 뭔지 이런 클래스가 왜있는지 공부하고싶은데 이런 코드유형을 알려주는 인강편이있나요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
하나의 비즈니스 로직에서 동일한 Connection을 사용해야 하는 것에 대해 질문드립니다.
강의를 듣다가 의문점이 생겨서 질문 드립니다.아래 코드는 강의중 작성된 코드입니다.private void bizLogic(Connection con, String fromId, String toId, int money) throws SQLException { //findById 호출시 connection을 전달 Member fromMember = memberRepository.findById(con, fromId); Member toMember = memberRepository.findById(con, toId); memberRepository.update(con, fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(con, toId, toMember.getMoney() + money); }강의를 듣던 도중 findById와 update는 굳이 같은 connection을 사용할 필요가 없다고 생각이 들었습니다.그래서 아래와 같이 코드를 수정했고 강의에서 작성한 테스트 코드가 정상적으로 성공하였습니다.private void bizLogic(Connection con, String fromId, String toId, int money) throws SQLException { //findById 호출시 connection을 전달하지 X Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(con, fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(con, toId, toMember.getMoney() + money); }여기서 드는 의문점은 findById는 DB에서 Member 정보를 가져오는 것이고, 이 기능은 계좌 이체를 위한 update와 다른 connection을 사용해도 문제가 없다고 생각됩니다. 그럼에도 불구하고, 하나의 비즈니스 로직 흐름에서 같은 connection을 사용하는 것이 DB의 원자성을 지키기 위해 중요하다고 생각했습니다.실무에서 한 비즈니스 로직 안에서 같은 connection을 사용하지 않아도 되는 경우에도 동일한 connection을 사용하는 것이 바람직한가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트케이스 findbyname
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)//get()추가하면 optional 깔 수 있음, 에러뜸[질문 내용]test케이스에서 findByName 테스트할때 Optional에서 까기 위해 get메소드를 한번 더 써주신다고 하셨는데get()대신 optional로 테스트하면 에러가 발생됩니다.값에 optional[]이 붙어서 그런거같은데 이 경우는 get() 추가 사용 대신 optional로는 테스트 못하는건가요?