repository에 직접 접근하는 기준이 어떤건지 궁금합니다. 강의에서 예를 들면 @Override public Member updateInfo(Long memberId, MemberInfoUpdateRequest memberInfoUpdateRequest) { Member member = memberFinder.find(memberId); checkDuplicateProfile(member, memberInfoUpdateRequest.profileAddress()); member.updateInfo(memberInfoUpdateRequest); return memberRepository.save(member); } private void checkDuplicateProfile(Member member, String profileAddress) { if(profileAddress.isEmpty()) return; Profile currentProfile = member.getDetail().getProfile(); if(currentProfile != null && currentProfile.address().equals(profileAddress)) return; if(memberRepository.findByProfile(new Profile(profileAddress)).isPresent()){ throw new DuplicateProfileException("이미 존재하는 프로필 주소입니다: " + profileAddress); } } 이 부분에서 member를 찾아올 때는 memberFinder를 통해서 가져왔는데 아래 중복 체크에서는 repository를 바로 사용했습니다. 물론 강의에서 profile을 찾는거기에 memberFinder에 넣기에는 책임이 난잡해질 것 같다는 느낌은 듭니다만 여기서 구분한 기준이 있는지 궁금합니다. 다른 예를 들면 public LoginResponse login(LoginRequest request) { Member member = memberFinder.findByEmail(request.email()); if(!member.verifyPassword(request.password(), passwordEncoder)){ //일치하지 않으면 에러 } //이 부분은 직접 접근하는게 좋은지 member.updateLastLoginAt(); memberRepository.save(member); //아니면 memberUpdater라는 포트를 통해 접근하는게 좋은지 memberUpdater.updateLastLoginAt(); return new LoginResponse(member.getId(), member.getStatus()); } 이런 경우 둘중 어떤 방법이 더 구조적으로 좋은지 궁금합니다.
[질문 내용] 24분 27초에 연관관계 편의 메서드 위치는 컨트롤 하는 쪽에 있는 게 좋다. 라고 하셨는데 연관관계의 주인쪽이라고 이해를 했습니다. 그렇다면 OrderItem을 추가하는 메서드는 Order쪽이 아니라 OrderItem에 해주어야 하는 게 아닐까 생각이 드는데 맞을까요?
1.오타 JobScope와 StepScop가 선언된 빈은 애플리케이션 구동 시점에는 우선 프록시 객체로만 존재한다. 그 후 Job이나 Step이 실행된 후에 프록시 객체에 접근을 시도하면 그 때 실제 빈이 생성된다. StepScop <-오타 2.건의(내가틀렸을수도있음 그러면 수정해주셈) 그리고 JobParameters가 잡 실행 내부에서 불변이라는 내용이 필요할거같음 배치쓰던사람들은 당연한거라 생각할수있는데(잡파라미터랑 잡이름으로 유니크체크한댔나 그런거도 있으니까) 배치 첨쓰는사람은 왜 잡파라미터가 있는데 ExecutionContext를 사용하지 라는 생각을 할수있을거같음 3.궁금증 컴파일 시점에 없는 값을 어떻게 참조할 것인가? 여기서 잡의 스텝생성시점에서 di받는 잡파라미터 자리에 null을 넣는식으로 처리하는 방법이 있다고했는데,만약 코틀린의 경우엔 명시적으로 잡파라미터를 ?를 붙여서 nullable로 선언하고 로직에서 NullSafe 박는식으로밖에 해결할수없고 저게 맘에안들면 빈주입해야함? 저런 null전달같은 꼼수딴거없음? 강의가 자바기반이라고 적혀있어서 물어봐도되나싶긴한데 예전에 저것땜에 고생했었는데 다른방법을 못찾아서 물어봄
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] // @Transactional public void update(Long id, String name, String city, String street, String zipcode) { Address address = new Address(city, street, zipcode); Member member = memberRepository.findOne(id); member.setName(name); member.setAddress(address); } 위와 같이 update 메서드의 @Transactional 을 주석 처리하고 해봤습니다. 제 예상이라면 응답값이 새로워진 값이 아니라 기존의 값이 응답값으로 내려와야 할 것 같았습니다. @PutMapping("/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable Long id, @RequestBody @Validated UpdateMemberRequest request ) { memberService.update( id, request.name, request.city, request.street, request.zipcode ); Member findMember = memberService.findOne(id); return new UpdateMemberResponse(findMember.getId(), findMember.getName()); } 왜냐하면 결론적으로 엔티티 자체는 수정되었지만 DB에 쿼리가 날라가지 않았고 위 컨트롤러 코드에서 find 메서드는 엄연히 다른 트랜잭션에서 진행되니(애초에 업데이트는 트랜잭션이 없었지만) 다른 영속성 컨텍스트가 존재할 것이며, 1차 캐시또한 비워져있을 테니(애초에 업데이트는 영속성 객체를 가지고 있지 않았기에 1차캐시에 없음) 즉, 컨트롤러에서 find한 Member 객체는 새로 DB에서 가져온 객체 == 기존 객체 일테니 응답 값이 기존 값과 같아야할텐데 아래와 같이 달라진 값을 응답으로 내려주고 있었습니다. 왜 그런걸까요? 가입 응답 { "name": "hello", "city": "city", "street": "street", "zipcode": "12345" } 수정 응답 { "name": "hello@", "city": "city@", "street": "street@", "zipcode": "12345@" }
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의에서 강사님께서 11에서 17로 바꾸라는 모든 설정 확실하게 수정 완료했고 gradle 코드 수정하여 실행하니 A problem occurred configuring root project 'library-app'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed to create Jar file C:\Users\seong\.gradle\caches\jars-9\3baa90cc2341a9ffd1656b87b2a3526e\spring-core-6.2.11.jar. 아래와 같은 jar 파일 오류가 떴습니다. 구글링과 GPT를 써보니 캐시 파일 버전 충돌 오류라고 하여 캐시 파일을 삭제 하려고 해도 디렉터리가 비어있지 않다는 오류가 뜨며 삭제되지 않고, 또 .\gradlew wrapper 버전이 현재 7.5인데 스프링 부트 3.5.6은 최소 8.x를 사용한다고 하여 이것 또한 업그레이드 하려고 하였으나 PS C:\Project\Study-SpringBoot\library-app> .\gradlew wrapper --gradle-version 8.3 --distribution-type all Starting a Gradle Daemon, 5 stopped Daemons could not be reused, use --status for details FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring root project 'library-app'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed t o create Jar file C:\Users\seong\.gradle\caches\jars-9\3baa90cc2341a9ffd1656b87b2a3526e\spring-core-6.2.11.jar. 동일한 이런 jar 파일 오류가 떴습니다. 이 오류를 어떻게 해결해야 할까요 .... 도와주세요 ㅜㅜ
func 매서드에서 while문 마지막 실행문인 node = node -> next -> next; 가 이해가 잘 안되었는데요. 해당 실행문 위에 있는 다른 실행문은 node->value 또는 node->next를 통해서 n1메모리에 참조해서 그 값을 가르키기 때문에 =을 통해 값변화가 일어난다. 하지만 node = node -> next -> next; 의 경우에 node는 func메서드가 가지고 있는 지역변수이기 때문에 main에서부터 참조받은 n1 변수를 변경하지 않는다. 이게 맞을까요? 저말고도 다른분들도 여럿 같은 질문을 했는데 정확한 답변이 없어서 제가 이해한게 맞는지 올려봅니다.. 그럼에도 확실하게 개념이 잡히지 않네요. node -> value 또는 node -> next조차도 func메서드 안에 있는 지역변수의 요소들인 건 매한가지 아닌가요...ㅠㅠ node도 메모리주소.. node->next->next도 메모리주소인데.. 왜 지역변수로 얕은복사(?)가 되는 것인지..ㅠㅠ
3주차 수업 자료(notion) category 안에 Training 이 없습니다. 글 내용 흐름에 따라 Training 대신 Fiction 으로 수정하면 될 것 같습니다 🙂 아래 GROUP BY 를 통해서도 없다는 것을 다시 한 번 확인할 수 있습니다. GROUP BY 조회 결과
comp 메서드에 매개변수가 들어갈 때, str.length-1로 들어가면 뒤에서부터 재귀함수가 시작해서 d부터 들어가고 c b a가 순서대로 들어가야하는 것 처럼 보이는데요. 이때, if문 안에서 result = c + result 로 되어 있는데요. result에 이미 d가 들어가있다고 가정했을 때 식이 진행되면 result = "cd"가 되는 것인지 result = "dc"가 되는 것인지 궁금합니다. 만약 전자라면 정답이 abcd가 되어야 하는 것이 아닌가요? index 마지막부터 시작되니까요.
위 이미지처럼 코드 실행 시 오류가 발생하는데, 원인 파악이 안돼서 여쭤보고자 합니다. 이전에는 LangSmith API KEY 미존재 오류가 발생하여 .env 파일에 LANGCHAIN_API_KEY, LANGCHAIN_TRACING_V2 값 모두 등록해놓은 상태입니다.
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 단순 궁금증입니다. 도메인 설계에서 여러 OrderItem을 만들 수 있도록 설계했으면서 정작 Service에선 한 개의 ItemId, count를 받게 하신건 의도하신건가요? 의도하신거였네요. 뒷 내용을 확인하지 않고 질문을 달았었네요..
안녕하세요 주말코딩님. 선생님의 강의를 듣고있는 정보처리기사 실기를 수강하고 있는 학생입니다. 1회차는 떨어졌고, 2회차는 사정 상 접수를 못하게 되어 3회차에 접수하여 응시를 할 생각입니다. 1회차는 아마 40점정도로 맞은 것 같습니다. 이론은 대부분 맞혔지만 코드에서 대부분 정답을 맞히지 못해 불합격을 하고 말았습니다. 선생님의 강의를 30일플랜에 맞춰서 활용하려고 하는데 몇 가지 여쭙고 싶은 게 있어 질문을 드리고자 합니다. 3회차 시험 날까지 30일정도 시간이 있으며, 낮에는 회사에 근무하고 있어서 공부 시간은 저녁 7시부터 가능한 상황입니다. 주말에는 가정사가 있어 1-2시간정도만 학습이 가능한 상황입니다. 시험을 대비하기에 충분한 시간이 될 수 있을까요? 이론은 최근 나온 기출문제에 나온 문제들로 이미 틈틈이 학습 중입니다. 하지만 문제가 코드를 푸는 문제에 있어서 걱정이 됩니다. 일단 코드 문제를 풀 때 main부터 차근차근 풀어나갈 때, 어딘가 반드시 막히게 되더라구요.. 기초는 있지만 응용이 잘 안되는 것 같습니다. 혹시, 정보처리기사 실기문제를 ide상에서 복사해서 붙여 넣지 않고 직접 코딩을 해보는 것이 이해에 도움이 될까요? 30일 플랜을 짤 때 어떻게 짜면 좋을까요? "1주차에는 몇 강을 듣고 몇 강을 들어라"이런 식으로 조언 부탁 드립니다. 바쁘시더라도 답변 부탁 드리겠습니다. 감사합니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 16.타입 안전 열거형 패턴 12:30 쯤 new ClassGrade();로 새로운 객체를 만들어서 discountServies.discount의 파라미터로 사용 하셨는데 newClassGrade.BASIC 으로 파라미터를 입력하면 BASIC은 ClassGrade의 스태틱 필드이기 때문에 정상적으로 비교 가능한게 아닌지 궁금합니다. 만약 정상적으로 비교하다면 new를 기능에 크게 문제가 없는데 왜 private로 변경해야 하는지도 궁금해요!
선생님은 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { 에서 값이 같으면 cnt++ 을 하는데 여기서 자기 자신도 갯수를 새어서 cnt를 하나 더하지만 여기서는 어차피 모두 한다 cnt 를 똑같은 개수만큼 각 학년당 하나씩 ++ 해서 5가 더해질거고 각 학생마다 cnt 값이 아닌 cnt 가 가장 큰 학생을 고르는 문제이므로 선생님께서는 이 부분을 고려하지 않은것인지 여쭙고 싶습니다
[질문 내용] 묵시적 조인인 select t.members from Team t 이것과 명시적 조인인 select m from Team t join t.members m 이 둘의 SQL 결과는 같았습니다. JPQL은 객체지향 쿼리니까 객체로 생각해보아도 t.members는 List<Member> 컬렉션 자체이고 t.members m으로 별칭을 주면 이 m은 Member 단위라는 게 혼자 생각도 해보고 질문 글도 보고 검색도 계속 했는데 그 어디에도 납득가는 설명이 없어서요. 그냥 외워야 하는 부분일까요?ㅠ
쿠폰 100개를 발급해야하고 이 개수는 100을 넘어가면 안됨 -> java synchronized락의 경우 쿠폰 발급을 담당하는 서버가 여러개라면 db에 쿠폰 저장(개수 업데이트) 요청이 동시에 올수 있으므로 race condition 발생 -> redis의 경우 여러 서버가 쿠폰 발급 요청을 보내도 싱글 스레드이므로 쿠폰 발급 수를 정확히 100개로 맞출 수 있음. 하지만 예제의 경우 threadpool을 사용하여 각 스레드별로 쿠폰 발급이 가능하면 바로 db에 쿠폰 저장하는 로직이라서 db 부하가 심함 -> kafka를 도입하여 스레드들이 쿠폰 발급 메세지만 카프카로 보내고 카프카 컨슈머가 이 메세지를 처리하여 db에 쿠폰을 저장함. 컨슈머 그룹에 속한 컨슈머는 현재 하나이므로 메세지 1개씩을 처리함 따라서 db에 부하가 심하지 않음.