묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 데이터 JPA
public void changeTeam 함수
안녕하세요. Member가 team이 바뀌면 this.team = team; team.getMembers().add(this);team이 변경되어서 현재 멤버의 팀 정보를 업데이트하고 새로운 팀에 새로운 멤버를 넣는다라고 이해했는데요,기존 팀에 속해있던 멤버 정보는 안지워도 되는걸까요? 감사합니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
git 사용 오류 질문 드립니다
강의 내용대로 진행 후 commit 창과 git 창을 열었을 때 제가 이전에 작업했던 파일들 (D: 루트 디렉토리 안에 있는 이전에 git에 업로드한 적 있는 모든 파일들)이 함께 보입니다파일 경로를 모두 열어보면 선택해서 진행할 수는 있지만 해당 프로젝트의 git 시작 디렉토리가 제대로 설정되지 않은 것 같아 어떻게 해결하는지 질문 드립니다
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
레이어드 아키텍처 개발에 대하여
섹션 6 진화하는 아키텍처의 3번째 강의인 핵사고날에 대한 사견 강의 중 8분 9초에 강사님께서 시스템이 명확할 때, 추상화가 너무 많이 되어있다면 쓸모없는 구역이라고 말씀하시고 Spring/JPA/RDB 이 3개를 쓸게 명확하다면 레이어드 아키텍처로 개발하라고 말씀하셨는데 그럼 기술 스택이 명확한 상황이라서 레이어드 아키텍처로 개발을 시작하게 된다면 전체적인 강의 통틀어서 말씀하셨던 의존성 역전, JPA에 종속적인 문제, 도메인 중점 개발 이런 것들이 필요 없어지게 되는걸까요?레이어드 아키텍처 개발이든 핵사고날 아키텍처로 개발을 하든 도메인을 중심으로 개발하는 것이 중요하다고 생각합니다. 하지만 의존성 역전으로 인한 추상화나 그로 인한 테스트 작성이 쓸모가 없어지게 되는걸까요?
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.
섹션3 - 테스트추가하기: h2를 이용한 service 테스트 에서UserService의 create 를 테스트하기 위해 Mock으로 주입된 JavaMailSender의 send를 다음과 같이 given 절에 추가하셨습니다. https://tecoble.techcourse.co.kr/post/2020-09-29-compare-mockito-bddmockito/에 따르면 BDDMockito는 given-when-then 구조의 시나리오 기반 테스트를 진행할 때, 시나리오에 맞게 테스트가 읽힐 수 있도록 도와주는 역할이라고 하였습니다. 따라서 저는 해당 코드를 when 절에 추가하였는데, 다른 분들은 어떤 의견이신지 궁금합니다...!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
jpa 로그 정보 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]jpa 특징은 "persist" 메서드 호출 시 바로 insert 쿼리를 날리는 게 아니라 트랜잭션을 커밋하기 직전 flush 가 발생해서 insert 쿼리 로그가 뒤에 찍힌다고 설명해주셨습니다.(영상 기준 4:50 ~ 5:12) 저도 같은 테스트코드를 실행시켰으나 강의 영상과 다르게 중간에 insert 쿼리 로그가 남는 것을 확인했습니다. 영상 촬영시점보다 hibernate 버전이 업그레이드 되어 로그를 남기는 시점만 변경이 된 것일까요? 아니면 flush 시점 자체도 변경이 된 건가요?
-
미해결실전! 스프링 데이터 JPA
team.getMembers().add(this);
Member 클래스 안의 changeTeam 메소드 관련 질문있습니다.해당 메소드안에 team.getMembers().add(this); 이 부분이 들어가게 되면 팀의 멤버를 찾는 쿼리가 한 번 더 나가게 될 것 같은데, 확인 결과 쿼리가 안나가는 것으로 보이는데 어떤부분을 알아보면 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 컨텍스트와 id 생성의 관계
안녕하세요. JPA활용1 강의 중 상품 리포지토리 개발 부분에서 궁금한 점이 생겨 질문드립니다. 첫 번째 사진은 ItemRepository의 save함수이고 두 번째 사진은 ItemService의 join함수입니다. save함수의 경우 persist(item)을 하였을 때, DB에 바로 저장되는 것이 아니라 트랜잭션이 커밋될 때까지 영속성 컨택스트에 들어있는 것으로 알고 있습니다. item의 id는 DB에서 부여하는 것이니 트랜잭션이 끝날 때가지 id값은 null일 것이라고 생각했습니다. 그런데 join함수를 보면 트랜잭션이 끝나기 전 item의 id를 return하는 부분이 있고, 실제 테스트를 했을 때도 id값이 1로 존재하는 것을 확인했습니다. 저는 item 엔티티를 만들 때 @GeneratedValue전략으로 SEQUENCE를 사용한 것도 아니고,return을 하는 시점은 아직 트랜잭션이 끝나기 전이라 DB에서 id를 부여한 것도 아닌데, 왜 id값이 존재하는지 궁금합니다. 아래와 같이 테스트를 진행했을 때 성공하였는데, 혹시 테스트를 잘못한 것일까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Section2 - 회원등록 API
안녕하세요. 실전! 스프링 부트와 JPA 활용 1편 강의를 수강하면서 작성한 코드에서 api라는 개념이 나와서 조금 헷갈려서 질문드립니다. 1) postman 사용은 단위 테스트처럼 사용하는건가요?개발한 코드에서 입력값을 넣고 함수가 잘 동작하는지 확인하는 용도인지 궁금합니다. 2) 외부 api를 다른 팀으로 제공을 한다고 말씀주셨는데 팀 간의 관계가 궁금합니다.1편에서는 html로 작성해서 데이터를 localhost에서 입력해서 받아온 후에 Controller에서 처리를 했었는데,2편시작에서는 controller api는 1편의 Controller의 차이점을 잘 모르겠습니다. 감사합니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
테스트에서 주입과 생성
안녕하세요 좋은 강의 잘 듣고 있습니다. 사소한 질문이지만요..! <테스트 추가하기:mockmvc 를 이용한 controlelr 테스트 강의>의 13:00 에서요 ObjectMapper 를 @Autowired 로 주입받아서 쓰지 않고 생성하셔서 쓰는 이유가 있을까요? 각각은 어떻게 다르고 장단이 있나요. 미리 감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
병합(merge)과 변경감지
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]JPA 활용 1편을 듣고 jpa기본편을 책과 함께 수강중입니다.JPA 활용 1편에서 merge를 사용하면 모든 값을 다 바꾸어서 파라미터로 지정해 주지 않으면 null값이 할당되어 데이터에 문제가 생길 확률이 높다고 배웠습니다. 따라서 이것이 merge의 특성인 거로 생각하고 있었는데,jpa기본편 책 105페이지에 jpa기본 전략은 엔티티의 모든 필드를 업데이트 한다 라고 되어있었습니다. 그래서 약간 혼란이 왔었는데 이내 다시 정리해볼 수 있었습니다.그래서 내려본 결론은 변경 감지를 통하여도 모든 필드가 업데이트 되는 것은 맞는데, 스냅샷을 통해서 변경 없는 필드의 정합성은 유지하고, 변경되는 부분만 안전하게 변경할 수 있다. JPA 활용 1편에서 한 merge예제는 준 영속인 엔티티 객체를 만들어 버렸기 때문에 필드 값을 할당할 때에 누락되면 기존 데이터가 반영이 안된다 (스냅샷 같은 것이 없기 때문) 으로 정리할 수 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ALL_SEQUENCES 테이블을 만들라고 하셨는데
강의에서는 ALL_SEQUENCES를 만들지를 않았는데어떻게 Oracle 버전에서 실행 하셨나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 database 테이블이 생성되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. users/dlwns 에 test3.mv.db 를 만들고터미널에 입력을 하여 연결을 했습니다.spring: datasource: url: jdbc:h2:tcp://localhost/~/test3 username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true logging: level: org.hibernate.SQL: debug그리고 Test를 진행했을 때,h2 database에 접근하면table이 생성되지 않습니다. 어떤 점이 문제인지 알고 싶습니다.감사합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
질문있습니다
스프링을 이용해서 플로터로 만든 안드로이드에 mysql정보를 넘길 수 있는 서버를 만들고 싶은데 가능 할까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL 질문
JPQL 모든 쿼리가 다음의 순서를 지키는 것인지 궁금합니다.(조회만인지?), 일단 다음의 순서를 전체조회 JPQL이라고 가정하겠습니다. flush -> flush로 인한 변경감지 update 쿼리문 적용 -> 이때동안 모은 쓰기지연 저장소 sql 쿼리 적용 1차로 DB 우선 조회2차로 영속성 컨텍스트 서치해서 DB와 겹칠 경우 영속성 컨텍스트의 엔티티로 대체 (Q&A 찾아보다가 얻게된 결론입니다.)1.의 제가 서술한 과정이 맞다면 이해가 안되는 것이 마지막 과정인 영속성 컨텍스트 서치 부분입니다. 이미 flush로 변경감지 등을 모두 적용했으니 영속성 컨텍스트를 다시 서치해서 얻을 이점이 있을까요? 단순 조회일 경우에 2차로 영속성 컨텍스트를 서치하는 것이 어떠한 이점도 없는 것 같아서요.
-
미해결실전! 스프링 데이터 JPA
테스트 코드에서 em.flush를 해줘야 dirtyChecking이 일어나는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 4:30 쯤에 dirtyChecking이 일어나게 하기 위해서, em.flush();를 꼭 해줘야하는 이유가 있을까요? 선생님 다른 강의에서는 find로 찾아온 객체를 setter를 통해 변경 후 따로 em.flush(); 를 하지 않았어도 transaction 끝나는 시점에 자동으로 update쿼리가 나갔던 것으로 기억하는데요. 혹시 junit을 이용한 테스트코드이어서 동작 방식이 다른걸까요? 감사합니다~
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
application.yml에 default_batch_fetch_size 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 관련내용의 질문들이 있으나, 제 케이스는 다른 것 같아서 질문 올립니다.아래와 같이 작성하였으나, 적용이 되지 않습니다.jpa: hibernate: ddl-auto: create properties: hibernate: default_batch_fetch_size: 100위치를 옮겨봤는데요, properties.default_batch_fetch_size 위치에서 적용이 되는 것으로 보입니다. 다만, 실제 실행해보면 적용되지 않습니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
준영속 상태 질문
준영속상태에 대한 설명에서영속성 컨텍스트에서 이전에 존재했지만 지금은 detach된 엔티티가 아니라영속성 컨텍스트에서 이전에 존재 + 적어도 한번은 flush()되어 DB에 엔티티가 존재하는 경우 아닌가요?즉 이전에 컨텍스트에서 존재 + flush로 인한 DB에 반영되었던 엔티티
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
질문 em.find(), JPQL 조회 및 이해 확인 질문
같은 조회이지만 JPQL은 무조건 플러시한다는 개념을 알게되었습니다 반면 find()는 그렇지 않은것으로 아는데 find()또한 1차 캐시에서 가져오지 못할 경우 플러시 후 가져와야하지 않나요? 이 두 방식은 결국 "플러시"라는 차이가 있어보이는데 이유에 대해 이해가 가지 않네요.영속성 컨텍스트에서 관리되는 엔티티 객체에 대해 수정을 할 경우 커밋시도시 먼저 엔티티의 최종적 모습을 확인해서 Update쿼리문을 만든다고 생각(쓰기지연저장소에 저장)했습니다. 반면 persist() 곧바로 쿼리문이 쓰기지연 저장소에 insert문으로 저장된다고 인지중입니다. 그렇다면 persist()후에 해당 엔티티를 수정을 가한다면 최종적으로 커밋시에 insert + update 두 쿼리문이 수행되는 걸까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 관계
자기소개서와 관련된 서비스를 구축하던 중에 관계 매핑에 의문점이 생겨서 질문 드립니다.회원 테이블, 카테고리 테이블, 제목 테이블이 존재하는데회원은 자기소개서에 대한 카테고리와 제목을 각각 하나씩만 지정하여 자기소개서에 대한 첨삭을 받을 수 있습니다.그런데, 서비스를 다시 사용하여 카테고리, 제목을 다른 것으로 지정하여 또 다른 자기소개서에 대한 첨삭을 받을 수 있습니다.이렇게 되면 두개의 자기소개서가 생기고, 이 내용들을 마이페이지에서 확인할 수 있도록 설계를 하려고 합니다.이런 구조라면, 회원-카테고리 / 회원 - 제목은 각각 1:1로 매핑이 되는 것이 맞는건지, 각각에 대한 history가 저장되어야 할 필요가 있을 것 같아 중간에 테이블이 필요하다는 생각이 들었습니다.어떠한 연관관계 매핑이 필요한지 감이 잘 안옵니다 ㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Lazy 강제 초기화 오류
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용]Lazy 강제 초기화 시, order.getMember().getName() 는@GetMapping("/api/v1/orders") public List<Order> listV1() { List<Order> orders = orderRepository.findAll(new OrderSearch()); for (Order order : orders) { order.getMember().getName(); ... } return orders; }다음과 같은 결과를 기대합니다.{ "id": 1, "member":{ "name": "memberA", }, ... }하지만 order.getMember() 까지만 초기화 되어, 다음과 같은 결과가 나옵니다. { "id": 1, "member":{ "id": 1, "name": "memberA", "address":{ "city": "주소", "street": "거리", "zipcode": "우편번호" } }, ... }Intelij 에서도 'Member. getName()'의 결과가 무시되었습니다 라고 에러가 뜨는데 그 이유가 궁금합니다.