inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

5:38초 질문입니다!

미해결

실전! Querydsl

5:38 초 부근 member 접근 할때 get 을 쓰면 안된다고 테스트니까 그냥 진행하신다고 하셨는데 이게 어떤의미인지 설명 가능할까요? 한 entity 에 대해서 직접적으로 접근 하기 보다는 dto 같은 전달 객체를 이용해서 가지고 와야 된다. 뭐 이런 뜻인건지 좀더 설명을 듣고 싶어 질문 올립니다!

  • java
  • JPA
dlektl6 댓글 1 좋아요 1 조회수 232

[과제] EnumMap, EnumSet

미해결

이펙티브 자바 완벽 공략 1부

## EnumMap Javadoc에 따르면 "when the map is created. Enum maps are represented internally as arrays. This representation is extremely compact and efficient." -> hashmap 은 key를 bucket에 저장하고각 bucket이 linked list를 참조 하고 있음. (linkedlist에는 hash(key)가 같은 element가 들어감) 그런데 enummap 의 경우 key로 사용할 값이 제한되어 있으므로, 그 갯수만큼 길이를 가진 array를 선언하고. 해당 index에 값을 넣으면 됨. ## EnumSet Javadoc에 따르면 "when the set is created. Enum sets are represented internally as bit vectors." -> hashset은 hashmap 과 같은데 map의 value가 있다 없다를 표현하는 지시자 같은 값이 들어감. enumset은 값이 있다 없다만 표시하면 되니까 enummap 처럼 array로 구현하지 않고 10101011 같은 bitvector로 구현이 가능.

  • java
멜론 댓글 1 좋아요 8 조회수 898

트랜잭션 밖에서 값을 수정했는데 왜 update 쿼리가 발생할까요?

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

위의 그림과 같이 트랜잭션을 시작하기 전에 데이터를 수정했는데 update 쿼리가 나가더라구요... 트랜젝션 밖에서는 값의 조회만 가능할 것 같은데 수정이 되는 이유가 궁금합니다!

  • java
  • JPA
JEONG HYUN KANG 댓글 1 좋아요 0 조회수 326

savedRequest.getRedirectUrl()가 null이 들어가서 로그인 후 localhost:8080/null이 나옵니다

미해결

스프링 시큐리티

안녕하세요. localhost:8080/로 들어가서 나오는 시큐리티의 기본 로그인 페이지에서 아무 계정으로 로그인을 하면 localhost:8080/null이 나옵니다. localhost:8080/login로 request를 보냈을떄도 로그인을 하면 localhost:8080/null이 나옵니다 response header를 보면 Location: http://localhost:8080/null 로 나와있고 디버그시에도 savedRequest가 null인게 확인되는데 로그인전에 request로 보낸 url이 httpSessionRequestCache에 저장돼서 로그인 이후 제대로 이동하려면 뭘 수정해야되나요? logout이나 rememberme같은 부차적인 요소들은 가독성을 위해 생략했습니다. 밑에는 코드입니다. // 메모리 방식으로 사용자를 생성하는 configure()는 생략함 @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login").permitAll() .antMatchers("/user").hasRole("USER") .antMatchers("/admin/pay").hasRole("ADMIN") .antMatchers("/admin/**").access("hasRole('ADMIN') or hasRole('SYS')") .anyRequest().authenticated(); http .formLogin() // .loginPage("/loginPage") .defaultSuccessUrl("/", true) .failureUrl("/login") .usernameParameter("userId") .passwordParameter("passwd") .successHandler(new AuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { System.out.println("authentication:"+authentication.getName()); // savedRequest가 null로 전달되는게 문제! RequestCache requestCache=new HttpSessionRequestCache(); SavedRequest savedRequest=requestCache.getRequest(request,response); String redirectUrl=savedRequest.getRedirectUrl(); response.sendRedirect(redirectUrl); } }) .permitAll(); // http.logout() 생략 // http.rememberMe() 생략 // http.sessionManagement() 생략 http.exceptionHandling() // .authenticationEntryPoint(new AuthenticationEntryPoint() { // @Override // public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { // response.sendRedirect("/login"); // } // }) .accessDeniedHandler(new AccessDeniedHandler() { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.sendRedirect("/denied"); } }); } @RestController @RequestMapping("/") public class SecurityController { @GetMapping public String index() { return "home"; } @GetMapping("loginPage") public String loginPage() { return "loginPage"; } @GetMapping("user") public String user() { return "user"; } @GetMapping("admin/pay") public String adminPay() { return "adminPay"; } @GetMapping("admin/**") public String admin() { return "admin"; } @GetMapping("login") public String login() { return "login"; } @GetMapping("denied") public String denied() { return "denied"; } }

  • Spring Security
  • spring-boot
  • java
gil jung 댓글 1 좋아요 0 조회수 641

spring.io

해결됨

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

버전이 달라서 그런지(최신) spring boot features 가 보이지 않습니다 ㅠ

  • spring-boot
  • spring
  • java
  • MVC
파바배라던도 댓글 2 좋아요 0 조회수 381

자바8로 하면 안되는 걸까요?

해결됨

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

자바11로 하는 이유가 궁금합니다~~

  • java
  • spring
  • spring-boot
  • MVC
파바배라던도 댓글 1 좋아요 0 조회수 364

GenerationType.SEQUENCE 전략

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 그 GenerationType.SEQUENCE 전략 일때 allocationSize를 지정하면 DB에 key값(id)을 얻기위해 디비에 매번 쿼리를 날리는게 아닌 일정 개수마다 쿼리를 날리기에 최적화가 된다고 하셨고, 그 원리는 메모리를 이용하기 떄문이다라고 하셨습니다. (질문1) 여기서 만약에 어플리케이션이 이중화가 되어있으면, 메모리를 이용한 key값(id) 설정이 조금 이상해질것 같기도한데, 이 부분에 대해서 이상이 없나요? (질문2) 이상이 없다면, 어떻게 처리하는지 알 수 있을까요?

  • JPA
  • java
정태연 댓글 2 좋아요 2 조회수 500

MemberForm의 패키징 위치?

미해결

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

강의 초반부에 MemberForm객체를 domain 패키지가 아닌 controller 패키지에 생성하시는 이유가 MemberForm 객체의 주 사용 클래스가 controller여서가 맞는지 궁금합니다..!

  • 패키지
  • JPA
  • spring
  • 웹앱
  • spring-boot
  • java
study4 댓글 1 좋아요 0 조회수 361

강의자료

해결됨

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

영한님이 강의할 때 사용하시는 강의자료(?)는 따로 업로드 안되어있는건가요? 제가 못찾는거인지 궁금합니다.... 베어라고 되어있는데 이 자료가 따로 업로드되어 있는지 궁금합니다..!!

  • java
  • spring-boot
  • spring
  • MVC
WOOKI 댓글 1 좋아요 0 조회수 516

@Transactional generate key 질문

해결됨

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

안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!

  • MVC
  • spring-boot
  • spring
  • java
나나 댓글 1 좋아요 0 조회수 367

야생형 코스대로 진행하려는데

미해결

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

야생형 커리큘럼 순서가 어떻게되는지 알수있을까요? 구글링해도 안나와서요 ㅠㅠ

  • spring
  • MVC
  • spring-boot
  • java
댓글 1 좋아요 0 조회수 506

@Aspect 사용할수 없음

미해결

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

Aop 섹션 Aop적용 강의에서 @Aspect 를 사용하시는데 저는 사용할수가 없습니다.. 라이브러리를 따로 추가해야하나요?

  • @Aspect
  • MVC
  • aspect
  • java
  • spring-boot
  • spring
유석균 댓글 2 좋아요 0 조회수 364

속도의 차이

해결됨

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

Assertions.assertEquals(result,member); 하고 assertThat(member).isEqualTo(result); 에서.. 위 메소드는 실행시간이 23ms이고 아래 메소드는 실행시간이 70ms로 나오는거 같은데.. 아래 문법이 더 좋은점이 있나요?..

  • spring-boot
  • java
  • MVC
  • spring
댓글 1 좋아요 1 조회수 203

MemberServiceTest 회원가입 오류

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 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)

  • MemberServiceTest
  • spring
  • java
  • spring-boot
  • MVC
댓글 2 좋아요 0 조회수 347

테스트 케이스 한 개 통과하지 못하는 문제

해결됨

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

solution 코드를 아래와 같이 작성했습니다. public static int solution(int n, int[][] board, int m, int[] moves) { int answer = 0; // stack 만들기 List<Stack<Integer>> stacks = new ArrayList<>(); for (int i = 0; i < n; i++) { Stack<Integer> tmp = new Stack<>(); for (int j = n - 1; j >= 0; j--) { if (board[j][i] == 0) break; tmp.push(board[j][i]); } stacks.add(tmp); } Stack<Integer> bucket = new Stack<>(); for (int i : moves) { if (!stacks.get(i-1).isEmpty()){ int newItem = stacks.get(i-1).pop(); if (!bucket.isEmpty() && bucket.peek() == newItem) { bucket.pop(); answer += 2; } else bucket.push(newItem); } } return answer; } board의 상단 인형에 접근하는 방법으로 저는 Stack의 List를 만들어 사용했고, 강사님은 직접 배열에 접근했다는 것이 차이점인 것 같습니다. 위 코드로 채점을 해보면 4번 test case까지는 통과하지만 마지막 5번 test case를 통과하지 못합니다. (리턴 : 22, 답 : 16) 코드의 효율성 문제를 떠나서 위 코드도 제대로 동작해야 될 것 같은데 마지막 케이스만 통과하지 못하는 이유를 도저히 못 찾겠네요ㅜㅜ 혹시 이유를 아시는 분이 계실까요..?ㅜ

  • java
  • 코테 준비 같이 해요!
현상혁 댓글 1 좋아요 0 조회수 332

중복회원예외에서 assertThrows

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 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 } <오류 화면>

  • spring-boot
  • MVC
  • java
  • spring
jangso825 댓글 2 좋아요 0 조회수 623

안녕하세요. flush 관련 질문드립니다

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요 만약 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 insert 문이 5개가 있는 상태에서 flush 한다면 5번의 insert sql과 1번의 커밋으로 총 6번을 데이터베이스와 통신하는 건가요? 아니면 5개 전부 한꺼번에 날리고 + 1번의 커밋으로 총 2번을 데이터베이스와 통신하는 건가요? (아니면 JDBC 의 SQL 배치 기능을 이용해야만 총 6번의 통신을 2번의 통신으로 줄일 수 있는 건가요?) 감사합니다

  • java
  • JPA
cgkim449 댓글 1 좋아요 1 조회수 257

회원과 주문의 양방향 연관관계가 실무에서는 주문이 회원을 참조하는 것으로 충분하다면

해결됨

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

아무래도 회원과 주문이 존재한다면 주문 내역 조회같은 로직이 거의 포함된다고 생각합니다! 이럴 때는 양방향 매핑 관계를 통해 조회하는 것이 좋은지 , 아니면 주문 테이블에서 member.getId()로 select 쿼리문을 날려서 조회하는 것이 좋은지 궁금합니다.

  • 웹앱
  • JPA
  • java
  • spring-boot
  • spring
.. 댓글 2 좋아요 1 조회수 362

코틀린으로 엔티티 작성

미해결

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의의 내용과 질문이 관계 없을수도 있지만 정답이 있는 부분이 아닌 것 같아 너무 궁금해서 남겨봅니다.. ㅠ 강의중에 코틀린을 사용할 때 되도록 불변으로 만드는 것이 좋다고 하셔서 User 엔티티를 이런식으로 작성했습니다. 이렇게 되면 유저의 필드를 변경하고 싶을 때 새로운 User 객체를 만들어야 합니다. 그래서 User 엔티티 안에 이런 메서드를 작성했습니다. 두 번째 방법으로 private set을 사용해서 setter만 막고 updateName 함수를 만들어줬습니다. 세 번째로 프로퍼티를 아예 private으로 설정하고 getter와 updateName 함수를 만들어줬습니다. 네 번째는 그냥 var로 만들어 기본 생성되는 getter와 setter를 사용한다 입니다. 정답이 있는 문제는 아니지만 저는 2, 3번이 좋은 방법이라는 생각이 듭니다. 그런데 자바의 저런 보일러 플레이트 코드들을 줄일 수 있는 것이 코틀린의 장점중 하나인데, 저렇게 사용하면 무슨 소용이 있나 싶기도 합니다. 그러다보니 코틀린은 getter, setter를 사용하는 것을 권장하게 설계되어있나? 라는 생각이 듭니다. 1번이나 4번 처럼 사용하는 것이 좀 더 코틀린스러운 개발 방법일까요?

  • oop
  • java
  • kotlin
dev.taeyeong 댓글 1 좋아요 1 조회수 1183

인기 태그

인프런 TOP Writers

주간 인기글