여러 개의 쓰레드 풀을 특정 업무에 배정할 수도 있나요?
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드 풀을 마련해 백엔드 was를 운영한다고 하셨는데, 이 쓰레드 풀을 특정 기능별로, 요청별로 나눠 여러 쓰레드 풀을 만들어 둘 수도 있나요? 예를 들면 결제 요청들만 처리하는 쓰레드 풀 A와 회원 정보 관리 요청들만 처리하는 쓰레드 풀 B가 있는 것이죠!
- spring
- MVC
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드 풀을 마련해 백엔드 was를 운영한다고 하셨는데, 이 쓰레드 풀을 특정 기능별로, 요청별로 나눠 여러 쓰레드 풀을 만들어 둘 수도 있나요? 예를 들면 결제 요청들만 처리하는 쓰레드 풀 A와 회원 정보 관리 요청들만 처리하는 쓰레드 풀 B가 있는 것이죠!
미해결
파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기
이 강의를 듣고 나면 네이버금융 뿐만 아니라 다른 웹 스크래핑도 가능할 것이라 하셨는데, 처음부터 너무 막히니 속상하네요. 스크립트는 다음과 같습니다. import pandas as pd from bs4 import BeautifulSoup as bs url = f"https://finance.yahoo.com/quote/YM%3DF/history?p=YM%3DF" table = pd.read_html(url) response = requests.get(url, headers = headers) html = bs(response.text) table = html.select("table") temp = pd.read_html(str(table)) temp[0] 여기서 url부터 인식을 못하고 HTTPError가 뜹니다. 해결방법이 있을까요? HTTPError : HTTP Error 404: Not Found
해결됨
[리뉴얼] 처음하는 파이썬 백엔드와 웹기술 입문 (파이썬 중급, flask[플라스크] 로 이해하는 백엔드 및 웹기술 기본) [풀스택 Part1-1]
https://stackoverflow.com/questions/50319752/httpie-not-recognizing-second-parameter-of-get-request 처럼 ex) http GET "localhost/api/data?param1=3¶m2=7" 으로 해결 가능합니다 도움 될까 하여 올립니다.
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
버전이 달라서 그런지(최신) spring boot features 가 보이지 않습니다 ㅠ
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바11로 하는 이유가 궁금합니다~~
해결됨
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요 강의 너무 잘 듣고 있습니다!! 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를 하나의 폼에서 다른 버튼을 눌렀을때 각각 동작하게 하는 방법은 없고, 각각 다른 폼을 이용해야 하는건지 궁금해서 질문드립니다!! 감사합니다!
해결됨
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 강사님, PasswordChangeForm 을 재정의 하는 부분에서 질문이 있어 글 남깁니다. 1. PasswordChangeForm은 SetPasswordForm을 상속받기 때문에 clean_new_password2를 오버라이딩하여 해당 함수가 기존 대로 실행 될때 단순히 old_password와 같은지 비교하는 로직을 추가한게 맞나요? 2. clean_new_password2를 오버라이딩 할 때, super().clean_new_password2()를 하지 않고 self.cleaned_data.get('new_password2')를 하게 기존의 pw1==pw2 확인하는 로직이 사라져 버리기 때문에 문제가 생기는 것이 맞나요? (실험결과 new_pw1, new_pw2 를 다르게 넣으면 new_pw1 으로 변경이 됩니다). 즉 super()... 를 적어줘야 기존 로직을 지킬 수 있는 것이죠? 3. clean_new_password1은 새로운 함수를 정의한 것인데 clean_ 이 앞에 붙었기 때문에 PasswordChangeForm의 로직이 동작할 때 무조건 해당 함수가 실행이 되는 것이 맞나요? 이 함수가 실행되는 시점이 궁금합니다. 감사합니다.
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요! 강의를 든던중 궁금한 점이 있어서 이렇게 질문 남깁니다. 스프링 컨테이너는 서블릿 컨테이너의 한 종류라고 인식을 해도 되는걸가요?
미해결
장고 설계철학으로 시작하는 파이썬 장고 입문
안녕하세요. 본 강의에 대한 내용을 실습하는데 PyCharm Professional이 필수적인지 문의 드립니다. 우선 community로 연습해보려고 하는데 실습이 안되는 파트가 있나요?
미해결
[개정판] 파이썬 머신러닝 완벽 가이드
안녕하세요. 강의 듣다가 궁금증이 생겨서 질문 드립니다. 이 Bike Sharing Demand 데이터 실습에서 원핫인코딩을 수행할 때, 인코딩을 먼저 수행 후 train과 test를 분리했는데, 실전을 포함해서 test 데이터가 이미 분리된 상태로 주어진 경우 도 많은 것 같아요. 근데 이럴 때 train과 test 각각 따로 인코딩을 수행하면 특정 칼럼에 대해 서로 없는 범주가 포함될 수 있을 것 같습니다. (예를들어 train에는 개/고양이만 있는데, test에는 개/고양이/원숭이 범주까지 있다던지..) 이 경우에 칼럼 갯수에도 차이가 발생할텐데 이때 모델 학습/예측시에 문제가 발생하지 않나요? 그렇다고 pd.concat 등으로 데이터를 합치고서 인코딩을 수행 후 다시 분리하면 데이터 리키징 문제가 발생한다고 들었습니다. (아니라면 말씀해주세요!) 머신러닝/딥러닝 강의 계속 잘 듣고 있습니다. 감사합니다.
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
영한님이 강의할 때 사용하시는 강의자료(?)는 따로 업로드 안되어있는건가요? 제가 못찾는거인지 궁금합니다.... 베어라고 되어있는데 이 자료가 따로 업로드되어 있는지 궁금합니다..!!
해결됨
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
요러케 여기서 전송을 누르면 다음으로 넘어가야하는데, 저는 누르면 이런 식으로 에러 뜹니다. 코드는 따라 타이핑 하였으며, html만 복붙했습니다,
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
야생형 커리큘럼 순서가 어떻게되는지 알수있을까요? 구글링해도 안나와서요 ㅠㅠ
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
검색하다보니 스프링 시큐리티로 로그인하는방법이 있어서 그런데 로그인에 대한 이론만 알려주시는건지 진짜 이렇게 실무에서도 쓰는지 궁금합니다.
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Aop 섹션 Aop적용 강의에서 @Aspect 를 사용하시는데 저는 사용할수가 없습니다.. 라이브러리를 따로 추가해야하나요?
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@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 접근 기술
Assertions.assertEquals(result,member); 하고 assertThat(member).isEqualTo(result); 에서.. 위 메소드는 실행시간이 23ms이고 아래 메소드는 실행시간이 70ms로 나오는거 같은데.. 아래 문법이 더 좋은점이 있나요?..
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요 질문 사항이 있어 글을 남깁니다. 구글링을 통해 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에서 오류가 생기는데 이를 해결할 방법을 알려주시길 부탁드립니다 <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 } <오류 화면>