MemberForm의 패키징 위치?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 초반부에 MemberForm객체를 domain 패키지가 아닌 controller 패키지에 생성하시는 이유가 MemberForm 객체의 주 사용 클래스가 controller여서가 맞는지 궁금합니다..!
- 패키지
- JPA
- spring
- 웹앱
- spring-boot
- java
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 초반부에 MemberForm객체를 domain 패키지가 아닌 controller 패키지에 생성하시는 이유가 MemberForm 객체의 주 사용 클래스가 controller여서가 맞는지 궁금합니다..!
미해결
반응형 웹사이트 포트폴리오(Architecture Agency)
말씀하신대로 index.html 과 style.css 풀 코드 올립니다. comment-dots image가 왜 적용 안되는지.. 혹 fontawesome 문제인지.. 설명 부탁 드리겠습니다. index.html: <!doctype html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>bizpage website - Architecture</title> <script src="js/jquery-2.1.4.js"></script> <!-- Page scroll Effects JS & CSS --> <script src="js/velocity/modernizr.js"></script> <script src="js/velocity/velocity.min.js"></script> <script src="js/velocity/velocity.ui.min.js"></script> <script src="js/velocity/main.js"></script> <link rel="stylesheet" href="js/velocity/velocity.css"> <!-- Smooth Scrolling --> <script src="js/jquery.scrollTo.min.js"></script> <!-- Custom JS & CSS --> <script src="custom.js"></script> <link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="responsive.css"> </head> <!-- hijacking: on/off - animation: none/scaleDown/rotate/gallery/catch/opacity/fixed/parallax --> <body data-hijacking="on" data-animation="rotate"> <div class="container"> <section class="cd-section visible" id="home"> <div> <div class="content"> <img src="images/temp-section-01.jpg"> </div> </div> </section> <section class="cd-section" id="about"> <div> <div class="content"> <img src="images/temp-section-02.jpg"> </div> </div> </section> <section class="cd-section" id="project"> <<div> <div class="content"> <img src="images/temp-section-03.jpg"> </div> </div> </section> <section class="cd-section" id="plan"> <div> <div class="content"> <img src="images/temp-section-04.jpg"> </div> </div> </section> <section class="cd-section" id="awards"> <div> <div class="content"> <img src="images/temp-section-05.jpg"> </div> </div> </section> <section class="cd-section" id="location"> <div> <div class="content"> <img src="images/temp-section-06.jpg"> </div> </div> </section> <section class="cd-section" id="contact"> <div> <div class="content"> <img src="images/temp-section-07.jpg"> </div> </div> </section> <header class="active"> <div class="gnb-inner"> <div class="logo active">bizpage</div> <div class="gnb active"> <div class="menu"> <a href="#home">Home</a> <a href="#about">About</a> <a href="#project">Project</a> <a href="#plan">Plan & History</a> <a href="#awards">Awards</a> <a href="#location">Location</a> <a href="#contact">Contact</a> </div> <div class="slogan">We think different and make different.</div> </div> <div class="trigger active"> <span></span> <span></span> <span></span> </div> </div> </header> </div> <a href="#" class="gototop active"><img src="images/gototop.png"></a> <a href="" class="btn-hiring"><i class="fa-duotone fa-comment-dots"></i>Hiring</a> <nav> <ul class="cd-vertical-nav"> <li><a href="#0" class="cd-prev inactive">Next</a></li> <li><a href="#0" class="cd-next">Prev</a></li> </ul> </nav> </body> </html> style.css: /* Google Web Font : Montserrat */ @import url('https://fonts.googleapis.com/css2?family=Nanum+Gothic&family=Nunito&family=Open+Sans&display=swap'); @import url('https://fonts.googleapis.com/css?family=Montserrat:200,300,400,500&display=swap'); @import url('https://fonts.googleapis.com/css?family=Manrope:300,400,500,600&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@200;300;400;600;700;900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Overpass&display=swap'); /* FontAwesome CDN 4.7 */ @import url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'); /* Reset CSS */ * { box-sizing: border-box;} ul {list-style: none;} a {text-decoration: none;} /* Default CSS */ body { font-family: 'Mondtserrat', 'sans-serif'; color: #222; font-size: 15px; margin: 0; height: 100vh; background-color: #fff; } /* Entire Layout */ .cd-section { height: 100vh; } .cd-section > div { height: 100%; position: relative; } .content { background-color: #ddd; position: absolute; width: calc(100% - 40px); height: calc(100% - 80px); left: 20px; bottom: 20px; overflow: hidden; } /* Header */ header { position: fixed; top: 0; left: 0; width: 100%; z-index: 100; } .gnb-inner { /* border: 1px solid #000; */ width: calc(100% - 40px); margin: auto; height: 60px; line-height: 60px; } .logo { font-size: 2.4rem; font-weight: bold; color: #066bf7; float: left; } /* .logd img { padding-top: 17px; } */ .gnb { float: right; } .menu { display: none; } /* .menu a {} */ .slogan { font-style: italic; font-size: 16px; float: right; } .trigger { display: none; } /* Hiring Button */ .btn-hiring { position: fixed; right: 30px; bottom: 30px; color: #fff; background-color: #000; padding: 10px 20px; border-radius: 20px; box-shadow: 5px 5px 20px rgba(0, 0, 0, 0.38); transition: 0.5s; } .btn-hiring .fa-duotone { transform: rotateY(180deg); margin-right: 5px; } .btn-hiring:active { transform: scale(0); }
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
영한님이 강의할 때 사용하시는 강의자료(?)는 따로 업로드 안되어있는건가요? 제가 못찾는거인지 궁금합니다.... 베어라고 되어있는데 이 자료가 따로 업로드되어 있는지 궁금합니다..!!
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
야생형 커리큘럼 순서가 어떻게되는지 알수있을까요? 구글링해도 안나와서요 ㅠㅠ
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Aop 섹션 Aop적용 강의에서 @Aspect 를 사용하시는데 저는 사용할수가 없습니다.. 라이브러리를 따로 추가해야하나요?
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 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)
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
grouping과 Collectors.toList의 차이가 무엇이고 emtrySet()은 무슨 기능인가요?
해결됨
자바(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) 코드의 효율성 문제를 떠나서 위 코드도 제대로 동작해야 될 것 같은데 마지막 케이스만 통과하지 못하는 이유를 도저히 못 찾겠네요ㅜㅜ 혹시 이유를 아시는 분이 계실까요..?ㅜ
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 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 } <오류 화면>
해결됨
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 만약 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 insert 문이 5개가 있는 상태에서 flush 한다면 5번의 insert sql과 1번의 커밋으로 총 6번을 데이터베이스와 통신하는 건가요? 아니면 5개 전부 한꺼번에 날리고 + 1번의 커밋으로 총 2번을 데이터베이스와 통신하는 건가요? (아니면 JDBC 의 SQL 배치 기능을 이용해야만 총 6번의 통신을 2번의 통신으로 줄일 수 있는 건가요?) 감사합니다
해결됨
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
아무래도 회원과 주문이 존재한다면 주문 내역 조회같은 로직이 거의 포함된다고 생각합니다! 이럴 때는 양방향 매핑 관계를 통해 조회하는 것이 좋은지 , 아니면 주문 테이블에서 member.getId()로 select 쿼리문을 날려서 조회하는 것이 좋은지 궁금합니다.
미해결
자바 개발자를 위한 코틀린 입문(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번 처럼 사용하는 것이 좀 더 코틀린스러운 개발 방법일까요?
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 예시에서는 각 서비스별로 연관되는 부분이 없어 BeforeEach를 사용하지 않아도 되지만, 테스트시 연관을 끊는 의도에서 BeforeEach를 사용하는것으로 이해했습니다. 현업에서도 각 메소드에 연관되는 부분이 없더라도 인스턴스생성시에 나눠주는편이 좀더 바람직하다고 볼수 있을까요? 연관되는부분이 있는지 파악하는것도 시간소요이고 실제 빌드시에 테스트코드는 빠지기 때문에 더하는편이 덜하는편보다 낫지 않을까 하는 판단입니다. 아직 직무경험이 없고 배우는 입장이라 이런식의 사고방향이 맞는것인지 궁금합니다.
해결됨
비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
안녕하세요 jwtsecretkey 관련하여 질문드립니다. jwtsecretkey는 강의에 나와있는대로 그대로 사용했고, host는 AWS EC2에 명시된 퍼블릭 IP주소, User명에는 mysql 사용자명, port는 3306, password는 mysql 접속 시 비밀번호, 그리고 사용할 database명까지 입력을 해주었으나 localhost로 접속 시, Cannot get이라는 창만 계속해서 뜹니다. 혹시 이런경우에는 jwtsecretkey를 제것을 따로 생성하지 않아서 발생하는 문제인지 알고 싶습니다. 만약 jwtsecretkey의 문제라면 어떻게 생성하면되는지 알려주시면 감사하겠습니다.
미해결
풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다) - 이외의 문의등은 평생강의이므로 양해를 부탁드립니다 - 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다 - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 질 좋은 강의 너무 잘 듣고 있습니다. 따로 권한을 받아서 볼 수 있는 강의 자료도 정말 잘 정리되어 있어 공부하기 수월해요!! 감사드립니다. 강의자료에 대해서 여쭤볼게있는데요. 1. 권한은 수업과 동일하게 기한제한없이 볼 수 있는건가요? 2. 개인적인 궁금증으로써.. 보통 초보(혹은 중급)개발자분들은 이러한 모든 css특징들을 모두 외우시는지, 아니면 이러한 기능이 필요해! 할때 구글검색을 하며(혹은 강의자료) 그때그때 꺼내쓰는건지 궁금합니다
해결됨
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery 어떤 부분에서 문제가 생기는지 못찾아서 전체 파일 첨부합니다.. https://drive.google.com/drive/folders/1I0oUU741fn4nApLLQ-e_16pY0H-dywyz?usp=sharing
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
책 381쪽에 보면 페치 조인 대상에는 별칭을 줄 수 없다라고 나오고, 대신 하이버네이트같은 몇몇 구현체는 지원해 준다고 나와있더라구요 "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", 위와 같은 JPQL에서 o.orderItems 과 페치조인하고 oi로 별칭을 주었는데, 이 별칭을 활용하여 join fetch oi.item i 처럼 또 페치조인을 하는데... JPA에서 공식 스펙은 아니지만 하이버네이트가 잘 지원해주는 것 맞나요? 최종 질문은 저렇게 페치조인 대상에 별칭주고 거기서 또 페치조인해서... 잘 써도 되는지 궁금합니다. JPA의 공식스펙이 아닌것 같은데 문제없이 동작하는지.. (위 같은 경우는 당연 일대일이나 다대일에서만 쓸것입니다)
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
메세지 검증방식으로 해보았습니다. Junit5로 시도하는분들에게 도움이 되길~ public class NotEnoughStockException extends RuntimeException{ @Override public String getMessage() { return "재고가 모자랍니다"; } } NotEnoughStockException thrown = assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), order)); assertEquals("재고가 모자랍니다", thrown.getMessage());