묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 초기화 부분에 대해서 이해가 되지않아 추가질문드립니다..
강의를 들어본 후, 다른 질문들도 참고를 해보았는데요. 프록시 초기화(프록시객체의 초기화) : 프록시 객체의 target필드에 실제 엔티티 객체의 참조를 설정하는것.1. <프록시 초기화 과정>em.getReference()를 하게되면, 프록시 객체가 영속성컨텍스트(1차캐시)에 저장된다. 프록시는 내부에 Member target;이라는 멤버변수(필드)를 가지고 있다.member.getName()을 호출한다.프록시가 아직 초기화되지않은 상태이므로, JPA는 영속성 컨텍스트에 초기화 요청을 한다. 영속성컨텍스트가 db조회를 해서 실제 엔티티객체를 생성하고 프록시 객체 내부의 target필드에 실제 엔티티객체의 참조를 설정한다.초기화된 필드를 통해 실제 객체의 메서드를 호출한다.---------------------------------------------------------------------2. em.getReference()를 하게되면, 프록시 객체가 영속성컨텍스트(1차캐시)에 저장된다. 초기화를 해도 실제 객체는 1차캐시에 저장되지않는다. 프록시 객체가 실제 객체의 참조를 가지고있기 때문에 프록시 객체를 통해 실제 객체를 사용할 수 있다. 즉 실제 객체가 1차캐시에 등록되는건 아니고 프록시 객체가 실제 객체의 참조를 가지고 있기 때문에 실제 객체가 1차 캐시에 등록되어 있는 것처럼 사용할 수 있다.==> 프록시 객체만 영속성컨텍스트에 저장되고 실제 엔티티객체는 영속성컨텍스트에 저장되지않는다.---------------------------------------------------------------------3. JPA는 동일한 트랜잭션안에서 동일한 PK에 대해 처음에 em.getReference()를 사용하면 프록시 객체를 반환하고, em.find()를 사용해도 프록시 객체를 반환한다. 이때 프록시 객체가 영속성컨텍스트(1차캐시)에 저장된다. 이후 em.find()를 사용해도 이미 1차캐시에 프록시가 존재하므로 프록시가 반환된다.반대의 경우 동일한 트랜잭션안에서 처음에 em.find()를 사용하면 실제 엔티티가 반환되고, em.getReference()를 사용해도 실제 엔티티를 반환한다. 이때 실제 엔티티가 영속성컨텍스트(1차캐시)에 저장된다. 이후 em.getReference()를 사용해도 이미 1차캐시에 실제 엔티티가 존재하므로 실제 엔티티가 반환된다. 위와 같이 이해하는게 맞을까요..?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
remove() 정확한 흐름을 알고싶습니다
링크위 링크 속 질문에 대한 답변을 아래와 같이 이해하였습니다. em.remove(member)를 하는 순간에 member가 1차 캐시에서 제거되고동시에 delete 쿼리가 쓰기 지연 SQL 저장소에 저장commit()을 만나면 내부적으로 flush()를 호출하고 쓰기 지연 SQL 저장소에 있는 쿼리가 나간다고 이해했습니다. 그리고 아래와 같은 테스트를 했을 때 의문이 생겼습니다Member member1 = em.find(Member.class, 101L); em.remove(member1); Member member2 = em.find(Member.class, 101L); System.out.print(member2); // null tx.commit();위 테스트의 결과는처음 member1을 찾을 때 select 문 1번remove()로 인한 delete 문 1번이처럼 총 2번 발생했습니다 하지만 제 생각은remove()를 하면서 1차 캐시에서 지웠기 때문에두 번째 find() 시에는 쿼리를 날려야 되는거 아닌가요? 그리고 또 이해가 안되는 부분은 member2를 찍어보면 null 이 나옵니다.commit()을 하기 전, 즉 flush()를 통해remove()에 의해 만들어진 쓰기 지연 SQL 저장소에 저장된delete 문이 나가기 전인데 왜 null이 찍히는 걸까요? 정리하자면두번째 find()는 왜 안 날라가는지member2는 왜 null 인지별도로 궁금한 점쓰기 지연 SQL 저장소에 있는 쿼리들은 들어온 순서대로 나가나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
초기화하면 1차캐시에
안녕하세요. em.getReference()를 통해 프록시 객체를 조회하면 1차캐시에 프록시객체가 저장되고, 이후에 getName()을하더라도 실제 엔티티객체는 1차캐시에 저장되지않고 프록시객체만 1차캐시에 저장되어있는건가요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 객체의 초기화 부분에서
안녕하세요. 강의 내용 15분쯤에 프록시 객체의 초기화 부분에서 설명해주신 부분이 잘 이해가 되지않아서 찾아보고 아래와 같이 정리해보았는데요. 이렇게 이해하는게 맞을까요? 프록시 초기화(프록시객체의 초기화) : 프록시 객체의 target필드에 실제 엔티티 객체의 참조를 설정하는것.em.getReference()를 하게되면, 프록시 객체가 영속성컨텍스트(1차캐시)에 저장된다. 프록시는 내부에 Member target;이라는 멤버변수(필드)를 가지고 있다.member.getName()을 호출해서 초기화 요청을 한다.JPA는 영속성 컨텍스트(1차캐시)에 실제 엔티티객체가 있는지 확인한다. 4-1. 있으면, JPA는 프록시 객체 내부의 target필드에 1차캐시에 있는 실제 엔티티객체의 참조를 설정한다.4-2 없으면, JPA는 db조회를 해서 실제 엔티티객체를 생성하고 프록시 객체 내부의 target필드에 실제 엔티티객체의 참조를 설정한다.초기화된 필드를 통해 실제 객체의 메서드를 호출한다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
h2 DB연결 오류
이 상황에서 연결 누르면 에러가 뜨는데 어떻게 해야될까요...
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터 조회 후 변경 시 쿼리 시점이 어떻게 되나요?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]선생님 질문이 있습니다.강의 22:00 쯤 변경 감지 듣다가 궁금증이 생겼습니다.질문은 영속 컨텍스트에 넣지 않은 상태로 DB에서 바로 가져올 땐 커밋 시점 보다 먼저 쿼리가 발생하나요? package hellojpa; import jakarta.persistence.*; import java.util.List; 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 member = em.find(Member.class, 450L); member.setName("XXXX"); // em.persist(member); System.out.println("=================="); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } } 출력결과 Hibernate:selectm1_0.id,m1_0.namefromMember m1_0wherem1_0.id=?==================Hibernate:/* updatefor hellojpa.Member */update Membersetname=?whereid=?예상 출력 결과는 === select ...update ...이렇게 나올 줄 알았는데요 왜 이렇게 나오지 않을까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
목록(페이징)처리구현 - import package 문의
강의수강중에 Pageable import 관련하여아래와 같은 Pageable을 선택하니까오류가 나오더라구요...type unmatch 형태//import java.awt.print.Pageable; springboot를 사용할 때는아래와 같은 org.springframework의 형태가import 우선순위가 되는것이 맞는건가요?import org.springframework.data.domain.Pageable;
-
미해결
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing 오류
스프링부트에서 Thymeleaf를 이용해 회원가입 폼을 만들고 있는데 폼에 입력을 제대로 하면 의도한대로 회원가입이 잘 됩니다.하지만 폼에 아무것도 입력하지 않으면 유효성 검사에서 @NotBlank를 만나서 그에 맞는 에러 메시지를 출력해야 하는데 저렇게 오류가 뜨네요... 대체 이유가 뭘까요 ㅠㅠ 제 회원가입 코드는 다음과 같습니다. User.java (Entity)@Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor @Entity(name="users") //테이블 이름 public class User { @Id //기본키 = userid @GeneratedValue(strategy = GenerationType.IDENTITY) private long userid; @Column(unique = true) //아이디 중복 방지 private String username; private String password; @Column(unique = true) //이메일 중복 방지 private String email; } RegisterDTO.java (DTO)@Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor public class RegisterDTO { @NotBlank(message = "아이디를 입력하세요.") private String username; @NotBlank(message = "비밀번호를 입력하세요.") private String password; @NotBlank(message = "이메일을 입력하세요.") private String email; } UserController.java (컨트롤러)@Controller @RequiredArgsConstructor public class UserController { private final UserService UserService; @GetMapping("/register") // 유저 등록 창 불러오기 public String ShowRegister(Model model) { model.addAttribute("userDTO", new RegisterDTO()); return "register"; } @PostMapping("/register") // 유저 등록 public String Register(@Valid RegisterDTO userDTO, BindingResult result, Model model) { if (result.hasErrors()) { // 유효성 오류 발견 System.out.println("유효성 오류"); return "register"; } try { UserService.saveDTOUser(userDTO); // 유저 등록 } catch (IllegalArgumentException e) { // 중복된 사용자 발견 System.out.println("예외 처리"); model.addAttribute("error", e.getMessage()); return "register"; } return "redirect:/userlist"; } } UserService.java (서비스)@Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; public void saveDTOUser(RegisterDTO userDTO) { if (userRepository.existsByUsername(userDTO.getUsername())) { throw new IllegalArgumentException("이미 등록된 아이디입니다."); } if (userRepository.existsByEmail(userDTO.getEmail())) { throw new IllegalArgumentException("이미 등록된 이메일입니다."); } User user = User.builder() .username(userDTO.getUsername()) .email(userDTO.getEmail()) .password(userDTO.getPassword()) .build(); userRepository.save(user); } } register.html<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Register User</title> </head> <body> <h1>Register User</h1> <form th:action="@{/register}" method="post" th:object="${userDTO}"> <label for="username">username:</label> <input type="text" id="username" name="username" th:field="*{username}" /> <div th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></div> <br> <label for="password">Password:</label> <input type="password" id="password" name="password" th:field="*{password}" /> <div th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></div> <br> <label for="email">email:</label> <input type="text" id="email" name="email" th:field="*{email}" /> <div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div> <br> <div th:if="${error}" class="error"> <p th:text="${error}"></p> </div> <button type="submit">Register</button> </form> <br> <a th:href="@{/userlist}">Back to User List</a> </body> </html> 컨트롤러에서 작성한 "유효성 오류", "예외 처리" 구문은 잘 나오더라구요. 그러면 유효성 검사는 잘 수행하는거 아닌가요?
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
validation 추가하기에 대해 질문
안녕하세요 validation 강의를 듣고 질문 드립니다. 강의 속에서 설명하신대로 하고 postman에서 실행을 하려고 보니 동작은 하는데 비밀번호 조건이 충족되지 않아도 defaultMessage가 뜨지않고 회원가입이 완료되었다는 창이 뜹니다ㅜㅜ @Valid 어노테이션 사용도 다 했는데 뭐가 문제인걸까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
findProductsBy 메소드에서 왜 Map 을 만들어 찾는지 잘 이해가 안됩니다
private List<Product> findProductsBy(List<String> productNumbers) { return productRepository.findAllByProductNumberIn(productNumbers); } 그냥 이렇게 바로 리턴 해도 되지 않나요??
-
해결됨Practical Testing: 실용적인 테스트 가이드
MockBean Deprecated
@MockBean 이 Spring Boot 3.4.0 버전부터 Deprecated 되었다고 경고를 띄워주는데요이런 경우 @MockitoBean 을 사용하면 되나요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 키 매핑 강의에서 질문입니다~
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. IDENTITY 전략일 때, 모아서 INSERT하는 게 불가능하다라고 말씀하셨는데, 이게 PK가 없는 상황에서만 불가능하고 다른 상황(pk가 있을 때 insert 쿼리, select 쿼리 등등)에서는 원래처럼 모아서 커밋 직전에 쿼리가 날라가는건지,아니면 정말로 IDENTITY 전략일 땐, 모든 JPA가 생성하는 쿼리가 커밋 직전이 아닌 그 때 그 때 나가는건가요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
spread ... 사용하는 이유가 궁금합니다
안녕하세요?[조회 페이지 이동] 영상을 보고 있는데요.List, Read Component에서는 spread를 하지 않고 바로 set으로 값을 넣었는데Add Component에서는 왜 {...initState}, {...todo}를 하는지 궁금합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터베이스 스키마 자동 생성 강의 질문입니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @Column(unique = true, length = 10)private String name 위와같이 코드를 작성할 때, 만약 DB 생성을 자동 기능으로 하지 않고, DB에 따로 테이블 생성을 진행했다면, 위의 코드가 있어도 반영이 안된다는 의미인거죠? 즉, DB에 따로 테이블을 만들 때 name 필드에 unique 제약 조건을 걸지 않고, varchar(255) 이렇게 했다면,아무리 @Column(unique = true, length = 10) 이렇게 한다고 해도 실제 DB에 반영이 되는 건 아니고 오직 DDL 생성할 때만 반영된다는 거죠?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderServiceTest에서 상품주문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.Book setName, setPrice, setStockQuantity 할 때 오류가 뜨는데 Item은 추상클래스에 Book이 상속을 받으니까 Book에만 setter를 설정하면 되는 거 아닌가요?item에 setter를 적용해야 오류가 풀리는데 왜 이러는지 궁금합니다.Book book = new Book(); book.setName("시골 JPA"); book.setPrice(10000); book.setStockQuantity(10);
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 2 강의에서 질문있습니다~
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 만약 JPA에서 batch_size 기능을 사용하지 않는다면, 그리고 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 쿼리 2개가 모여있는 상태라면, 커밋되기 전에 각각 다른 네트워크로 즉, 애플리케이션에서 DB로 요청이 2번 진행되서 쿼리가 날라가는 건가요? 그래서 batch_size 옵션으로 = 2가 되면 하나의 네트워크로 2개의 쿼리가 동시에 반영이 되는 건가요? 그래서 batch_size 옵션을 사용하면 API 속도 개선에 사용할 수 있는건가요?? 근데, 그렇다면 사실 무조건 batch_size 옵션을 최대한 크게 설정하면 좋은 거 아닌가요? 이것도 한꺼번에 너무 많은 쿼리들을 보내면 또 문제가 있으려나요??
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
moveToList 질문 드립니다.
안녕하세요 선생님. 좋은 강의를 정말 잘 듣고 있습니다ㅎㅎ [네비게이션관련 커스텀 훅] 강의에서 궁금한게 생겼는데요~ 쿼리 스트링에 page와 size가 있는데, moveToList에 파라미터로 page와 size를 전달해서 처리해야 하는 이유가 무엇인지 알 수 있을까요?
-
미해결1시간만에 끝내는 spring boot rest api 서비스 개발
item을 id로 get하는데 1을 넣었을 때 500에러가 나와요.
1넣으면 apple이 나와야 하는데, 500에러가 나오네요. 빌드는 잘 되었는데 어디가 문젠지 모르겠네요. 코드는 https://inf.run/8swaL올려두었습니다. 감사합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
저는 왜 OrderCreateRequest 에 기본 생성자가 없는데도 주문 신규 생성 호출이 되는건가요??
영상에서 OrderCreateRequest 클래스에 @NoArgConstructor 붙이던데.. 저는 안 붙인 상태로 돌렸는데도 돌아가는건 왜 그런건가요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
저만 화면이 나오지 않나요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]PC에서 소리는 나오는데 검은화면으로 나옵니다.