묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
일부 파일에서는 파라미터가 필요없을경우 어떻게하는게 맞을까요?
강의의 base와같은 기본 레이아웃이 있으며 파라미터 a,b,c를 받습니다 또한 이것을 호출 하는 html파일 a,b,c가있습니다 a와 c에서는 세가지 파라미터를 다 넣어주지만 b에서는 파라미터중 하나만을 사용해서 나머지 두 파라미터를 넘겨주지 않으려고합니다 넘겨주지 않는다면 에러가 나고 파라미터를 넘겨주기 위해 무의미한 태그를 두개 만들자니 좋지않아 보이는데 어떤식으로 하는게 적당할까요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
아규먼트 리졸버를 이용한 로그인 처리 관련 질문 입니다.
안녕하세요. 두 가지 궁금한 점이 있는데요. 우선, 컨트롤러가 RequestBody 나 HttpEntity 로 파라미터를 받을때는 아규먼트 리졸버가 항상 메세지 컨버터를 사용했었는데요. ArgumentResolver 강의에서는 아규먼트 리졸버가 세션으로 부터 Member 객체를 꺼내서 넘겨주는 시점에서 이미 컨트롤러에서 받는 Member 객체와 이미 타입이 일치하기 때문에 메세지 컨버터가 하는 역할은 여기서는 필요없다고 보면 될까요? 두번째 질문은, 인터셉터에서 이미 로그인 체크를 해서 로그인이 안되었을 경우 로그인 페이지로 리다이렉션을 하고 있는데 컨트롤러내에서 굳이 loginMember == null 을 체크해서 리다이렉션을 다시 처리해 주어야 하는지 궁금합니다. 실무에서는 로그인이 필요한 요청 핸들러 메소드에서는 로그인 체크가 이미 인터셉터에서 처리 되고 비인증 사용자는 인터셉터에서 걸러져서 핸들러 어뎁터 까지 오지 않는게 바람직한 처리라고 보면 될까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ModelAttribute 와 @RequestBody 질문입니다.
안녕하세요. 강의를 보다가 아직 모호한 부분이 있어서 질문 드립니다. @RequestBody는 Http Message Body 정보를 편리하게 조회할 수 있고 @ModelAttribute 는 파라미터 객체를 생성한 후에 setter를 호출해서 값을 binding 해준다고 하셨는데 그렇다면 @ModelAttribute는 HttpServlet의 기능을 사용하는 거고(get일때는 쿼리스트링 post일때는 Json), @RequestBody는 보내져오는 body 내용을 Json 형태인지 판별하고 보내주는 역할을 한다고 생각하면 될까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
미인증 사용자 요청에대해서 redirect 할 때
httpResponse.sendRedirect("/login?redirectURL=" + requestURI); 라고 되어있는데 queryString의 key 값을 URL로 하는거랑 URI 로 하는거랑 뭐가 더 적절한가여? 강의에서 URL이라했으니 그냥 URL로 적어주면 될까여? 왜냐면 변수명은 requestURI라고 해놓으셔서 궁금해요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
여러 개의 쓰레드 풀을 특정 업무에 배정할 수도 있나요?
쓰레드 풀을 마련해 백엔드 was를 운영한다고 하셨는데,이 쓰레드 풀을 특정 기능별로, 요청별로 나눠 여러 쓰레드 풀을 만들어 둘 수도 있나요? 예를 들면 결제 요청들만 처리하는 쓰레드 풀 A와 회원 정보 관리 요청들만 처리하는 쓰레드 풀 B가 있는 것이죠!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
spring.io
버전이 달라서 그런지(최신) spring boot features 가 보이지 않습니다 ㅠ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바8로 하면 안되는 걸까요?
자바11로 하는 이유가 궁금합니다~~
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
혼자서 삭제 구현중에 Request method 'DELETE' not supported 오류 질문드립니다!
안녕하세요 강의 너무 잘 듣고 있습니다!! CRUD중 D가 없어서 직접 구현하던중에 오류에 부딪혔는데 해결할 수 없어서 질문드립니다 ㅠㅠ 먼저 HiddenHttpMethodFilter를 사용해야 HTML Form에서 PUT, DELETE를 사용할 수 있다고 알고있습니다. 따라서 application.properties에 다음과같이 필터를 추가했습니다. # HTML form에서 GET, POST 뿐 아니라 PUT, DELETE도 사용하기 위해서 설정 spring.mvc.hiddenmethod.filter.enabled=true 이후 editForm.html에서도 다음과 같은 delete input태그 및 삭제 버튼을 추가했습니다. <form action="item.html" th:action method="post"> <input type="hidden" name="_method" value="delete"> . . 중략 . <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit" th:formaction="|@{/basic/items/{itemId}/edit(itemId = ${item.id})}|">저장 </button> </div> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit" th:formaction="|@{/basic/items/{itemId}/edit/delete(itemId = ${item.id})}|">삭제 </button> </div> </div> </form> 이후 다음과 같이 @DeleteMapping 컨트롤러를 작성했습니다. @DeleteMapping("/{itemId}/edit/delete") public String deleteForm(@PathVariable Long itemId, RedirectAttributes redirectAttributes) { Item deletedItem = itemRepository.delete(itemId); redirectAttributes.addAttribute("itemName", deletedItem.getItemName()); redirectAttributes.addAttribute("status", true); return "redirect:/basic/items"; } 문제가 되는 부분은 삭제 버튼은 잘 동작하고, redirectAttribute까지 잘 적용됩니다만, 오히려 저장 버튼을 누르면 Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported] 오류가 발생하네요 아무래도 기존 저장이 POST가 아닌 DELETE로 전송되어 생기는 문제같습니다. 궁금한점은 이렇게 DELETE와 POST를 하나의 폼에서 다른 버튼을 눌렀을때 각각 동작하게 하는 방법은 없고, 각각 다른 폼을 이용해야 하는건지 궁금해서 질문드립니다!! 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 컨테이너와 서블릿 컨테이너
안녕하세요! 강의를 든던중 궁금한 점이 있어서 이렇게 질문 남깁니다. 스프링 컨테이너는 서블릿 컨테이너의 한 종류라고 인식을 해도 되는걸가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의자료
영한님이 강의할 때 사용하시는 강의자료(?)는 따로 업로드 안되어있는건가요? 제가 못찾는거인지 궁금합니다.... 베어라고 되어있는데 이 자료가 따로 업로드되어 있는지 궁금합니다..!!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 요청 데이터 - post html form
요러케 여기서 전송을 누르면 다음으로 넘어가야하는데, 저는 누르면 이런 식으로 에러 뜹니다. 코드는 따라 타이핑 하였으며, html만 복붙했습니다,
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional generate key 질문
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
야생형 코스대로 진행하려는데
야생형 커리큘럼 순서가 어떻게되는지 알수있을까요? 구글링해도 안나와서요 ㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에서도 이렇게하나요??
검색하다보니 스프링 시큐리티로 로그인하는방법이 있어서 그런데 로그인에 대한 이론만 알려주시는건지 진짜 이렇게 실무에서도 쓰는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Aspect 사용할수 없음
Aop 섹션 Aop적용 강의에서 @Aspect 를 사용하시는데 저는 사용할수가 없습니다.. 라이브러리를 따로 추가해야하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
assertThat.contains
@Test void findAll(){ //given Item item1 = new Item("item1", 1000, 10); Item item2 = new Item("item2", 1000, 10); itemRepository.save(item1); itemRepository.save(item2); //when List<Item> result = itemRepository.findAll(); //then assertThat(result.size()).isEqualTo(2); assertThat(result).contains(item1,item2); } 항상 강의 즐겁게 듣고 있습니다. 강의를 듣던중 contains가 조금 궁금해서 질문드립니다. Item item1 = new Item("item1", 1000, 10); Item item2 = new Item("item2", 1000, 10); item1과 item2는 new로 생성한 객체여서 id가 null로 되어있다고 생각하고 List<Item> result = itemRepository.findAll(); result에는 itemRepository.save의 sequence++와 setId를 통해 Id값이 저장된 [1,Item], [2,Item] 두개의 키와 value가 저장되어 있다고 생각합니다.. 근데 여기서 contain로 비교하면 item1 Item(id=null, itemName=item1, price=1000, quantity=10) result안의 값 Item(id=1, itemName=item1, price=1000, quantity=10) item2 Item(id=null, itemName=item2, price=1000, quantity=10) result안의 값 Item(id=2, itemName=item2, price=1000, quantity=10) 서로 달라서 테스트가 실패해야하지않을까? 라는 생각이 들더라구요.. asseretThat( A ) .contains( B )가 dto를 비교할때 public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity;} 생성자에 있는 값으로만 비교하는걸까요?(추가해봐도 참이나오네요..) contains는 무엇을 기준으로 판단을 하는걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceTest 회원가입 오류
안녕하세요 질문 사항이 있어 글을 남깁니다. 구글링을 통해 Member findMember = memberService.findOne(savId).get(); 부분이 오류가 있다는 것을 알았습니다. 그리고 나서 다시 로직을 보면서 다시 하여도 똑같은 오류가 발생해 글을 올립니다. MemberServiceTest package com.test.inflearn.service;import com.test.inflearn.domain.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import java.util.Optional; //회색import static org.junit.jupiter.api.Assertions.*; /회색class MemberServiceTest { MemberService memberService = new MemberService(); @Test void 회원가입() { //given (뭔가가 주어졌을 때) Member member = new Member(); member.setName("hello"); //when (이걸로 실행 했을 때) Long savId = memberService.join(member); //then (결과가 이게 나와야 한다.) Member findMember = memberService.findOne(savId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test void findMembers() { } @Test void findOne() { }} MemberService package com.test.inflearn.service;import com.test.inflearn.domain.Member;import com.test.inflearn.repository.MemberRepository;import com.test.inflearn.repository.MemoryMemberRepository;import java.util.List;import java.util.Optional;public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /** * 회원 가입 */ public Long join(Member member) { //같은 이름이 있는 중복 가입 X validateDuplicateMemory(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMemory(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원 입니다."); }); } /** *전체 회원 조회 */ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId) { return memberRepository.findById(memberId); }} repository = MemberRepository(인터페이스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.List;import java.util.Optional;public interface MemberRepository { Member save(Member member); Optional<Member> finById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); Optional<Member> findById(Long memberId);// Optional<Member> findById(Long memberId);} repository = MemberRepository (클래스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.*;public class MemoryMemberRepository implements MemberRepository { private Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> finById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public Optional<Member> findById(Long memberId) { return Optional.empty(); } //test 를 한번 할때 마다 지워준다. public void clearStore() { store.clear(); }} domain = Member package com.test.inflearn.domain;public class Member { private Long id; private String name; //get, set public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }} 오류 메시지 at java.util.Optional.get(Optional.java:135) at com.test.inflearn.service.MemberServiceTest.회원가입(MemberServiceTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) 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:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
중복회원예외에서 assertThrows
assertThrows에서 오류가 생기는데 이를 해결할 방법을 알려주시길 부탁드립니다 <Memberservice> package hello.hellospring1.service; import hello.hellospring1.repository.MemoryMemberRepository; import hello.hellospring1.repository.MemberRepository; import hello.hellospring1.domain.Member; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository){ this.memberRepository = memberRepository; } /** * 회원가입 */ public Long join(Member member){ //같은 이름이 있는 중복 회원은 x validateDuplicateMember(member); //optional으로 한번 감싸면 optional안에 member객체가 있는거 //옛날에는 ifnull 지금은 optional로 감싸기 //optional로 바로 반환하는거는 추천x memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) //ctrl+alt+v .ifPresent(m -> { //result가 null이 아니면 즉, 값이 있으면 동작 throw new IllegalStateException("이미 존재하는 회원입니다."); }); } /** * 전체 회원 조회 */ public List<Member> findMember() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); } } <MemberServiceTest> -> 중복_회원_예외에서 오류 발생 package hello.hellospring1.service; import hello.hellospring1.domain.Member; import hello.hellospring1.repository.MemoryMemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; //import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; //import static org.assertj.core.api.Assertions.*; class MemberServiceTest { //test코드는 실제 코드에 포함 되지 않음 MemberService memberService; MemoryMemberRepository memberRepository; @BeforeEach public void beforeEach() { memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepository); } @AfterEach public void afterEach() { memberRepository.clearStore(); } @Test void 회원가입() { //given -> 이런게 주어지면 (이 데이터를 기반으로 하는 구나) Member member = new Member(); member.setName("hello"); //when -> 이게 주어졌을 떄 (이걸 검증하는 구나) Long saveId = memberService.join(member); //then -> 이렇게 실행 되어야 돼(여기가 검증부구나) // Member findMember = memberRepository.findById(saveId).get(); // assertEquals(member.getName(), findMember.getName()); Member findMember = memberService.findOne(saveId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } //test는 정상도 중요한데 예외도 중요함 @Test public void 중복_회원_예외() { //given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //when memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, ()->memberService.join(member2)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); /* try { memberService.join(member2); fail(); } catch (IllegalStateException e){ Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } */ //then } <오류 화면>
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 다운로드 부분 중 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 파일 다운로드 부분에서 궁금한 점이 생겨서 질문을 남깁니다 :) String storeFileName = item.getAttachFile().getStoreFileName();String uploadFileName = item.getAttachFile().getUploadFileName();여기 부분에서 이해가 안가는 부분이 있는데item.getAttachFile() 이 부분은 item.java에 있는 attachFile을 가져오는걸로 아는데뒤에 getStoreFileName은 UploadFile.java에 있는 storeFileName인데 이것을 어떻게 부를 수 있는지 궁금합니다..item으로 받았는데 UploadFile에 storeFileName을 부를 수 있다는게 이해가 잘 안가서여 ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
현재 테스트예시에서의 BeforeEach 현업에서 사용
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 예시에서는 각 서비스별로 연관되는 부분이 없어 BeforeEach를 사용하지 않아도 되지만, 테스트시 연관을 끊는 의도에서 BeforeEach를 사용하는것으로 이해했습니다. 현업에서도 각 메소드에 연관되는 부분이 없더라도 인스턴스생성시에 나눠주는편이 좀더 바람직하다고 볼수 있을까요? 연관되는부분이 있는지 파악하는것도 시간소요이고 실제 빌드시에 테스트코드는 빠지기 때문에 더하는편이 덜하는편보다 낫지 않을까 하는 판단입니다. 아직 직무경험이 없고 배우는 입장이라 이런식의 사고방향이 맞는것인지 궁금합니다.