안녕하세요. 지식공유자님! 데이터베이스 연결 강의를 보고 질문 드립니다. 서비스를 command와 query로 분리하고 있는데요. 이것을 cqrs 패턴으로 부른다고 알고 있습니다. 이게 좋다고는 들었는데, 정확히 왜 그런지는 잘 모릅니다. 만약, 면접관이 "cqrs에 대해서 아느냐? 왜 이렇게 구현했느냐?" 라고 묻는다면, 지식공유자님께서는 어떻게 답변하시겠습니까? 감사합니다.
안녕하세요 수업자료 관련하여 문의드립니다. 수업자료중 강의에서 문제들만 있고 프로그래밍언어 이론부분은 따로 내용이 없는거 같네요 시간은 촉박한데 필기하면서 하려니 시간이 많이 소모되어 이론부분도 같이 업로드 해주시면 감사하겠습니다. 만들기가 귀찮으시다면 영상에 사용하는 화면을 pdf로 따서 바로 올려주셔도 좋을것 같아요
15분대 문제 초기 설정 a,b=1 sum=0 으로 시작 While문 1~5까지 if 문 b가 짝수이면 sum+b, 아닐시 sum-b 계산 후 a증감 b+2 계산으로 해석했습니다 그래서 a=1 홀수 sum-b 계산 sum=-1, b=3 후에 a증감 a=2 a=2 짝수 sum+b 계산 sum=2, b=5 a=3 홀수 sum=-3 ,b=7 a=4 짝수 sum=4, b=9 a=5 홀수 sum=-5, b=11 계산 후 a=6, b=11로 while문 조건에 맞지않아서 빠져나오게 되면 sum은 -5아닌가요???
2023 2회 20분경 문제 오류 찾기요 kim을 넣어서 public person(string val)으로 간다까진 이해했는데요. 거기로 가면 public person(string val)부터 시작이 아니라 위인 private string name부터 시작인가요? 그래서 private string name은 static string get()을 부르는 함수인가요????ㅠㅠㅠ연결 고리를 모르겟어요 그리고 return 반환에서 오류가 나서 7 정도가 오류 위치라고 하신건가요?
강사님의 말에 맞춰 java-start 프로젝트를 생성하였습니다만 아래 그림과 같이 프로젝트 폴더에 External Libraries와 Scratches and Consoles만 보이고 java-start 프로젝트가 보이지 않게 됐습니다. 어떻게 해결할 수 있을까요? 프로젝트 생성 시 설정은 다음과 같습니다: Build System: IntelliJ JDK: 18 Oracle OpenJDK 18.0.1 - aarch64 (M1 Mac입니다)
아래링크 문의에 대한 추가 질문입니다. https://www.inflearn.com/questions/1385202 버전과 동일한 소스코드 동일한 것으로 확인됩니다. 또한, restart 후에도 동일한 현상 확인되어 추가문의드립니다. 혹시, intellij community 버전이라 그런건지 문의드리며 해결방법 확인부탁드립니다!!
11분 07초 A a = new A(); A b = new B(); 위 두개는 이렇게 생성하겠다 라는 생성만 하는 문장이지 않나요? b.paint(); 는 출력을 하는 문장이므로 실행될때 classA의 기본생성자인 Contruct~와 classB의 기본생성자인 Contruct~가 출력되고 난후 B()내의 paint()가 실행되는건 이해가 갑니다. 근데 b.paint(); 가 실행되기 전에 A a = new A();를 선언함으로서 즉시 classA의 Contructor ~가 출력 되는 것이 이해되지 않습니다ㅠㅠ
강사님, 안녕하세요. 강의 잘 듣고 있습니다. 강의를 듣다 궁금한 점이 생겨 질문 남깁니다. C언어 - 함수 부분(31:18) 홀수인지, 짝수인지 판별하기 문제 [오답] 10는 짝수입니다. 13는 짝수입니다. 01는 홀수입니다. 1는 홀수입니다. (0) [정답] 10는 짝수입니다. 13는 짝수입니다. 1는 홀수입니다. (0) 저는 위에 제시한 오답처럼 풀이를 진행하여 해당 문제를 틀렸습니다. 제 풀이는 함수 정의 부분에 있는 첫 번째 if문에서 retrun 0을 반환(print)하고 그 아래에 있는 if문에 있는 else까지 실행시켜 오답이 되었습니다. 1) if 문 질문 isEven 함수 정의 부분에서 첫 번째 if문만 실행되고, 두 번째 if문은 실행되지 않는지 궁금합니다. 2) return, printf 질문 다른 문제에서도 이러한 식으로 오답을 작성한 적이 있는데, return과 print의 차이에 대해 설명해주시면 좋겠습니다. (혹시 예시를 알려주실 수 있을까요?) 교안 관련 질문 python 변수와 출력 예제 부분 pdf에 '\n'이 빠져있는 것 같습니다. 강의에는 잘 반영되어 있는데 pdf에는 빠져있는 것 같아서요! (이미 수정하셨을 수도 있을 것 같습니다. ㅎㅎ 확인 부탁드려요) 실습 관련 환경 설정 가볍게 실습 코드를 돌려보고 싶은데 어느 환경에서 하는 것이 좋을까요? 코랩으로 시도해보았으나 좀 불편한 것 같아 보통 어느 환경에서 실습을 진행하는지 여쭙고 싶습니다!
안녕하세요. API 서버 구현 - 1 의 내용에 대해서 질문 드립니다. package com.library.service; import com.library.controller.response.PageResult; import com.library.controller.response.SearchResponse; import문을 보면 BookQueryService 와 BookRepository 가 controller 패키지의 DTO들을 의존하고 있습니다. 3-tier architecture 에서는 한 방향으로 의존 관계가 흘러야 한다고 알고 있는데, 아키텍쳐 부분에 대해서 의견을 듣고 싶습니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 해당 강의에서 설명하는 내용은 JPA를 가지고 Application단에서 연관된 객체들의 생명주기를 관리해주는 것인데 그러면 db단에서 직접 cascade 속성을 걸고 관리해주는것과 어떤 차이가 있나요? 둘다 같이 적용해도 되는건가요? 아님 둘중 하나만 해주면 되나요? app단에서 다 해주면 DBA 가 필요한가?라는 궁금증도 생기네요. 실제 현업에서는 어떤 방법을 더 많이 사용하는지 알려주시면 감사하겠습니다.
강의 자료 3. 공통 인터페이스 기능 마지막 주요 메서드 부분 getOne(ID): 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출 여기에 적힌 getOne이 스프링 데이터 JPA 2.5 부터 getById로 변경 되었고 스프링 데이터 JPA 2.6 getReferenceById로 변경되어 3.0 부터 getById도 deprecated 되었다고 들었는데 강의 자료에는 변경되어 있지 않는 것 같습니다.
이전 강의를 수강 하면서 엔티티 조회 시 지연 로딩 설정 시 즉시 조회가 되는 게 아닌 프록시 객체가 데이터의 위치를 가지고 사용할 때에 프록시 객체가 초기화 되며 데이터베이스에 쿼리를 요청하고 데이터를 받아 온다 라고 배웠습니다. 그렇다면 테스트 메서드를 실행하게 된다면 Team, Member 객체를 persist -> 영속성 컨텍스트에 Member와 Team 존재 flush() -> 영속성 컨텍스트에 들어있던 엔티티를 데이터베이스에 반영 -> insert 쿼리가 실행 데이터베이스에 반영되었으나 아직 영속성 컨텍스트에는 값이 존재하는 상태 clear() -> 영속성 컨텍스트에 들어 있는 데이터를 초기화 createQuery로 Member 엔티티를 데이터베이스에서 조회 -> Member에 대한 select 쿼리 실행 영속성 컨텍스트가 초기화 되었고 team이 지연 로딩으로 설정되어 프록시 객체가 생성 루프를 돌며 getTeam() 호출 시점 team_id를 기반으로 데이터베이스에 team을 조회 -> Team에 대한 select 쿼리 실행 memberA 조회 후 teamA에 대한 조회 쿼리가 발생하고 memberC 조회 후 teamB 조회 쿼리가 발생 이러한 과정으로 이뤄진다고 배웠는데 테스트 코드를 돌려보니 member에 대한 조회 쿼리 후 team에 대한 조회 쿼리가 발생하지 않습니다. 그래서 팀의 프록시 객체가 초기화 되었는지 체크하기 위해 Hibernate.isInitialized를 사용해 찍어봤는데 제일 처음 false 로 초기화 되지 않았다고 나오나 team을 조회하는 쿼리가 발생하지 않았습니다. 찾다 보니 Hibernate에 쿼리 최적화 기능으로 영속성 컨텍스트는 초기화 되었지만 메모리가 초기화 된 것은 아니므로 해당 객체가 메모리에 존재한다면 Hibernate가 쿼리를 생략하고 해당 객체를 반환한다라는 게 있던데 그것 때문에 쿼리가 나가지 않는 건지 궁금합니다. 2차 캐시가 설정되어 있지는 않습니다. 스프링 부트 3.3.4, 자바 17, Hiberante 6.5.3 입니다! * 해결 * spring.jpa.properties.hibernate.show_sql=true 하이버네이트 show_sql이 주석처리 format_sql만 출력되는 상황이었습니다. 정상 출력 확인했습니다! package springPJ.dataJpa.domain; import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.hibernate.Hibernate; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional @RequiredArgsConstructor @Slf4j class MemberTest { @Autowired EntityManager em; @Test void testEntity() { Team teamA = Team.builder().name("teamA").build(); Team teamB = Team.builder().name("teamB").build(); em.persist(teamA); em.persist(teamB); Member memberA = Member.builder().name("memberA").age(10).team(teamA).build(); Member memberB = Member.builder().name("memberB").age(20).team(teamA).build(); Member memberC = Member.builder().name("memberC").age(30).team(teamB).build(); Member memberD = Member.builder().name("memberD").age(40).team(teamB).build(); em.persist(memberA); em.persist(memberB); em.persist(memberC); em.persist(memberD); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member member : members) { log.info("team.isInitialized = {}", Hibernate.isInitialized(member.getTeam())); log.info("member = {}", member); log.info("member.team = {}", member.getTeam()); } } } select m1_0.member_id, m1_0.age, m1_0.name, m1_0.team_id from member m1_0 2024-09-21T19:36:05.194+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = false 2024-09-21T19:36:05.194+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=1, name=memberA, age=10) 2024-09-21T19:36:05.197+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=1, name=teamA) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = true 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=2, name=memberB, age=20) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=1, name=teamA) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = false 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=3, name=memberC, age=30) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=2, name=teamB) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = true 2024-09-21T19:36:05.220+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=4, name=memberD, age=40) 2024-09-21T19:36:05.220+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=2, name=teamB)
case 5 만족해서 len-= 1; 로직을 통해 len 값이 4로 된거까지는 이해했는데 case 6 부터는 조건값이 만족하지않는데도 로직 내용대로 사칙연산이 적용되어서 최종값이 7이 되는게 맞나요? 아래 케이스로 내려가는건 맞는데 조건값이 일치해야 안에 내용이 실행 되지않나 싶어서요.