안녕하세요 김영환님! 프록시가 영속성 컨택스트에 의해 관리되고, 동일 트랜잭션에서는 영속성 컨텍스트 내에 동일성을 위해 엔티티는 프록시에 저장된다는 답변을 보고 질문을 남깁니다. 저는 그래서 1차 캐시에 프록시가 저장이 되고 (id는 동일하므로) 실제 엔티티 객체는 1차 캐시에 직접적으로 저장되기 보다는 프록시에 저장(래핑) 되는 형태로 이해했는데요. 그렇다면 스냅샷은 어떻게 관리되고, 더티체킹은 어떻게 되는지 궁금합니다. 프록시와 감싸여진 실제 엔티티 모두가 스냅샷이 저장되나요? 더티체킹은 어떻게 진행되나요??? 추가적으로 프록시의 id는 getReference()를 호출하면서 입력해준 id가 되는데 이때 id가 db 상에 존재하지 않는다면 초기화때 어떤 예외가 발생하는지도 궁금합니다. 좋은 강의 감사합니다!!
안녕하세요. 이번 강의를 들으면서 질문하고자 하는 내용은 바로 앞 강의 CustomUserDetailsService 구현만으로 로그인이 정상적으로 되는지 안 되는지 체크를 해 주었는데, 이번 강의에서는 CustomAuthenticationProvider 를 사용해서 입력 비밀번호와 디비 저장 비번을 matches 로 비교를 직접하셨는데요. 기능적으로 두 강의의 차이를 모르겠어요. 그럼 실제 사이트에서 로그인 로직을 만들때는 CustomUserDetailsService, CustomAuthenticationProvider 모두를 구현해 줘야 하는건가요? 감사합니다. ^.^
안녕하세요. 도메인 주도 모델을 공부하면서 강의를 복습하고 있습니다. 비즈니스 로직이 Entity 객체에 들어가는 이유 등은 조금씩 이해가 가고 있는 중입니다. 그런데 제가 경험이 없다보니 이론서와 예제를 비교하다 보니까 다른 점이 몇 가지 있어서 실제로는 반드시 이론대로 사용하는 것은 아닌가? 라는 생각도 들고 학습을 위해서 간단히 만드신 건가 잘 모르겠어서 질문드려봅니다. 도메인 주도 설계 아키텍쳐를 보면 1 프레젠테이션 계층 2 애플리케이션 계층 3 도메인 계층 4 인프라스트럭처 계층 이렇게 나누어진다고 하는데요. 여기서 1 프레젠테이션 계층이 MVC이고 영상에서 나오는 controller domain service는 3 도메인 계층으로 보입니다. 그런데 2 애플리케이션 계층은 보이지 않고 애플리케이션 계층이 와야 할 자리에 도메인 계층이 있는 것처럼 보입니다. 예를 들면 도메인 객체인 Entity나 Repository가 Controller에서 사용되고 있습니다. 이론서를 보면 컨트롤러에서는 도메인 계층의 구현을 알지 않는 것이 좋으며, 모든 도메인 계층에 대한 호출은 어플리케이션 계층 안에서(ex entityApplicationService Class 안에서) 이루어지는게 좋다고 하더라고요. 실무에서도 예제처럼 어플리케이션 계층을 생략하고 할 때가 많나요? 아니면 강의에서는 학습용으로 생략이 된 것인지 제가 무언가 간과하고 있는 부분이 있는지 궁금해서 이렇게 질문드리게 되었습니다.
1 : N 관계에서 19:35 를보시면 만약에 1 (Team)쪽을 주인으로 정하면 Team의 members의 값을 바꾸면 다른테이블에 update 쿼리가 나간다고 말씀해주셨습니다. 근데 햇갈리는건 N 쪽을 주인으로 정해도 member.getTeam().setName("test"); 이렇게 하면 update 쿼리가 Member 테이블이 아닌 Team 테이블에서 나갑니다 같은 현상 아닌가요 ? // 저장 Team team = new Team() ; team.setName( "TeamA" ) ; em.persist(team) ; Member member = new Member() ; member.setUsername( "member1" ) ; member.setTeam(team) ; member.getTeam().setName( "test" ) ; em.persist(member) ; em.persist(team) ; em.flush() ;
안녕하세요. 좋은 강의 만들어주셔서 감사합니다. 아래와 같이 강좌와 유사하게 spring.datasource.hikari 로 mysql 설정을 한 후 간단한 job 을 실행시키면 docker 로 설치한 mysql db 가 죽는 현상이 있습니다. 혹시 hikari 설정이 부족해서 그런 것일까요? 강좌에서는 잘 진행이 되는것 같아서 질문드립니다. 그래서 주석 처리하고 기존에 하던 방식으로 spring.datasource 를 이용해서 mysql 설정을 했습니다. spring.datasoruce 는 datasource 설정인거 같고, spring.datasource.hikari 는 hikari connection pool 설정인거 같은데요. 헷갈리네요. 어디에 db 설정을 정의하는것이 기본일까요? spring : profiles : active : local --- spring : config : activate : on-profile : local datasource : # hikari: # jdbc-url: jdbc:mysql://av-api01-dc.nfra.io:23306/aida_project?useUnicode=true&characterEncoding=utf8 # username: root # password: root # driver-class-name: com.mysql.cj.jdbc.Driver url : jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 username : root password : root driver-class-name : com . mysql . cj . jdbc . Driver batch : jdbc : initialize-schema : always
https://www.inflearn.com/questions/53961 이 글을 보고 git bash를 설치해서 인텔리제이에 적용하여 사용중입니다, 윈도우 환경에 자바 버전은 11입니다. java -jar 명령어를 사용해서 .jar 파일을 실행하는 과정이 잘 되지가 않습니다. 파일 이름이 demo-0.0.1-SNAPSHOT.jar 라서 java -jar demo-0.0.1-SNAPSHOT.jar 라는 명령어를 계속 입력했는데 아무 반응도 일어나지 않습니다. 뭐가 잘못된 걸까요?
안녕하세요. <수정, 삭제 벌크 연산> 강의에서 다음 코드에 대한 질문이 있습니다. @Test public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); em.flush(); em.clear(); List<Member> result = queryFactory .selectFrom(member) .fetch(); for (Member member1 : result) { System.out.println("member1 = " + member1); } } em.flush();를 하는 순간 영속성 컨텍스트에 있던 정보가 DB에 반영되게 되는데, 이렇게 되면 update(member)에서 수정한 DB 정보와 충돌이 발생되지 않나요? 따라서 member.username이 "비회원"으로 수정되지 못 하는 것 아닌지요? 읽어주셔서 감사드립니다.
강사님 안녕하세요. 매번 질문만 하게 되는데 답변 친절히 해주셔서 감사합니다 ㅠ 강의를 보면서 궁금한 점이 있었는데 우선 첫번째로, FactoryBean으로 Map객체를 구현하는 이유가 있을까요? 만약 저에게 구현해보라고 한다면, UrlFilterInvocationSecurityMetadataSource에서 데이터들을 가져와서 한번에 했을 것 같은데.. 뭐 이런식으로.. FactoryBean으로 구현하신 이유는 DefaultFilterInvocationSecurityMetadataSource와 최대한 비슷하게 구현하기 위해서 그렇게 하신건가요? 두번째로, UrlResourceMapFactoryBean에서 if (resourceMap == null ) { init( ) }이라고 하셨는데, 이렇게 하신 이유가 무엇때문에 그런건가요? resourceMap은 호출때마다 DB에서 불러와야 하는 것 아닌가요? 항상 감사합니다 ..
안녕하세요 스프링부트환경에서 junit 으로 테스트 케이스를 작성하고 테스트를 하는데 시간이 너무 오래걸리는데 단축할 수 있는 방법이 있는지 알고 싶습니다 테스트 케이스에서 @Autowired 로 서비스를 가져다 쓰고 있는데 실행할때마다 프로젝트의 모든 스프링빈들이 다 올라가고 테스트가 실행되는 것 같습니다 보통 실무에서는 어떻게 하는지 궁금합니다 어쩔 수 없는 부분인건지 아니면 실무에서는 테스트케이스에서 사용하는 서비스만 로딩해서 하는 방법으로 하는건지 잘 모르겠네요 실무에서는 어떤 방법을 써서 테스트 수행시간을 줄이나요? 만약 해당 서비스만 로딩해서 한다면 그 방법도 알고 싶습니다 감사합니다
안녕하세요 강사님. 15:50부터 시작하는 '올바른 USER 모델 지정방법'설명이 제대로 이해가 가지 않습니다. 제가 아래와 같이 이해한게 맞는 내용인가요? 장고에서는 기본적으로 auth에서 User모델을 제공해준다. 그러나 개별 앱에서 User모델을 만들었을 때 Model.py에서 제대로 인식하지 못하므로 settings.py에서 'AUTH_USER_MODEL = 'instagram.User' 를 작성해주고, Models.py에서도 author = models.ForeginKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)로 작성해줘야 한다. 이렇게 이해했는데 제가 이해한 부분이 맞을까요? 맞다면 개별 앱에서 user모델을 작성하게 되는 이유는 무엇인가요? 간단한 예제로 설명해주시면 이해가 갈 것 같습니다!
안녕하세요. 예제를 돌려보던중 궁금한 점이 생겨 문의 드립니다. public class JpaMain { public static void main (String[] args) { EntityManagerFactory emf = Persistence. createEntityManagerFactory ( "hello" ) ; EntityManager em = emf.createEntityManager() ; EntityTransaction tx = em.getTransaction() ; tx.begin() ; try { Member member1 = em.find(Member. class, 150L ) ; member1.setName( "AAA" ) ; //em.detach(member1); //em.clear(); em.close() ; System. out .println( "=====================" ) ; tx.commit() ; } catch (Exception e) { tx.rollback() ; } finally { em.close() ; } emf.close() ; } } 위와 같이 테스트 하였는데요. em.detach(member1); em.clear(); 과는 달리 em.close(); 의 경우는 업데이트 문이 찍히고 DB도 업데이트 되는데 나머지 둘과는 다르게 동작하는걸까요?
안녕하세요. cascade는 동일한 aggregate 에 포함되는 경우에 넣는거겠죠? 저희 예제에서 delivery는 order에서 cascade로 포함했는데 만약 다른 테이블에서 delivery를 참조하고 있으면 order_delivery 라고해서 별도의 테이블을 만들어도 되겠죠? 데이터 중복이지만 ddd에서 바운더리 컨텍스트 그런 개념에서 보면 문제가 없는걸까요?
그 예전에 영한님께서 JSON으로 반환 할 때 쿼리를 통해서 얻은 값을 그대로 반환하지 말고 클래스로 묶어서 반환하라고 하셨던게 기억이 납니다. 쿼리를 통해서 얻은 결과가 예를들어 List<PersonDto> name : ~~~ age : ~~~ address: ~~ 이런식으로 되어 있을때 이 리스트를 그대로 반환하면 JSON 형식이 배열로 시작해서 그 후에 값을 수정 할 수 없다고 들었던거 같은데요!! 질문이 있습니다 저 List<PersonDto>를 감싸는 하나의 클래스를 만들때 예를 들어서 class PersonExmpleDto{ private ArrayList<PersonDto> persondto; ] 이런식으로 반환 할 때 클래스 이름을 어떻게 해야 할 지 모르겠습니다.... 쿼리를 통해서 얻은 List로 묶은 PersonDto를 하나의 클래스에서 반환하고자 할 때 클래스의 네이밍은 어떤식으로 하나요? class PersonListDto{ private ArrayList<PersonDto> persondto; } 이런식으로 하나요...??