본문 바로가기

전체 글

(428)
도커 명령어에 대하여 왜 sh를 마지막에 적는가?Docker 명령어 구조: docker run [옵션] 이미지 [실행할 명령] 입니다.따라서: docker run -it busybox sh를 해석하면:docker run | ├── 옵션: -it | ├── 이미지: busybox | └── 실행할 프로그램: sh입니다. docker run -it busybox sh명령어에서 -it의 의미와 sh에 대해 더 알려줘docker run -it busybox sh에서 가장 중요한 부분은 사실 -it와 sh의 관계입니다.이 명령어는 단순히 "BusyBox를 실행한다"가 아니라:BusyBox 컨테이너를 실행하고, 그 안에서 Shell 프로그램(sh)을 실행한 뒤, 내가 직접 키보드로 명령어를 입력할 수 있..
n+1문제에 대해서 N+1 문제는 JPA에서 연관관계 데이터를 조회할 때 SQL이 예상보다 많이 실행되는 문제입니다. 특히 FetchType.EAGER(즉시 로딩)에서 자주 발생합니다.쉽게 말하면:한 번 조회하면 될 것을, N개의 데이터를 추가로 조회해서 총 N+1번의 SQL이 실행되는 문제입니다.1. 예시로 이해하기다음과 같은 엔티티가 있다고 가정해 보겠습니다.Member 엔티티 @Entitypublic class Member { @Id private Long id; private String name; @ManyToOne(fetch = FetchType.EAGER) private Team team;} Team 엔티티 @Entitypublic class Team { @Id privat..
protected기본생성자를 사용하면 왜 개발자는 함부로 생성하지 못하고 JPA같은 프레임워크는 접근이 가능한거야? 김영한 ⇒“기본적으로 JPA를 사용한다면 리플렉션이나 프록시 같은 기술을 사용해야 하는데 기본생성자가 없으면 리플랙션 혹은 프록시같은 기술을 사용할 수 없습니다. 기본생성자를 public 으로 설정하면 실수가 발생할수 있기 때문에 protected까지 허용해 줍니다.“좋은 질문입니다. 이 부분은 Java의 접근 제어자(access modifier)와 JPA의 리플렉션(reflection)을 이해해야 합니다.결론부터 말하면:protected 기본 생성자는 일반 개발 코드에서는 접근을 제한하지만, JPA는 Java Reflection을 사용하기 때문에 객체 생성이 가능하다.입니다.1. protected의 기본 의미Java 접근 제어자는 다음과 같은 순서로 접근 범위를 가집니다.접근 제어자같은 클래스같은 패키..
@Embeddable에 대해서 @Embeddable은 JPA에서 값 타입(Value Type)을 정의할 때 사용하는 어노테이션입니다.쉽게 말하면:"이 클래스는 독립적인 테이블로 만들지 말고, 다른 엔티티의 컬럼에 포함시켜서 사용해라"라는 의미입니다.1. 일반적인 엔티티(Entity)와 비교예를 들어 회원(Member)이 있다고 해보겠습니다. @Entitypublic class Member { @Id @GeneratedValue private Long id; private String name; private String city; private String street; private String zipcode;} DB 테이블은:MEMBER------------------idnamecitystre..
@Inheritance에 대해서 (3가지 전략) 다음코드에서 InheritanceType.JOINED에 대해 알려줘. 자바 객체의 상속 구조를 JPA가 데이터베이스 테이블 구조로 어떻게 매핑할지 결정하는 어노테이션입니다. 1. 실제로 테이블을 생성하는 역할은 누가 할까?테이블 생성은 @Inheritance가 아니라 Hibernate의 DDL 자동 생성 기능이 담당합니다.예를 들어 persistence.xml에서: 또는 Spring Boot에서: spring: jpa: hibernate: ddl-auto: create 이 설정이 있으면 Hibernate가:엔티티 클래스를 분석하고JPA 어노테이션을 읽고SQL CREATE TABLE 문을 만들고DB에 실행합니다.2. 그러면 @Inheritance는 무엇을 제공할까?예를 들어: @Entit..
cascade = CascadeType.ALL은 어떨때 주로 쓰이고 왜 쓰여? cascade = CascadeType.ALL의 의미:부모 엔티티의 저장, 수정, 삭제 같은 상태 변화를 자식 엔티티에게 자동으로 전파한다.주로 사용하는 경우:✅ 부모와 자식의 생명주기가 동일할 때✅ 자식이 부모 없이 의미가 없을 때대표적인 예:Order | ├── OrderItem | └── Delivery 같은 도메인입니다.반대로:Member |Order 처럼 독립적으로 관리해야 하는 데이터에는 신중하게 사용해야 합니다.cascade = CascadeType.ALL은 부모 엔티티의 상태 변화를 자식 엔티티에게 자동으로 전파하기 위해 사용합니다.쉽게 말하면:"부모를 저장하거나 삭제할 때, 연결된 자식도 같이 처리해줘"라는 의미입니다.1. Cascade가 필요한 상황예를 들어 주문 시스템을 생각해보겠습니..
@ManyToOne은 왜 EAGER가 기본? @OneToMany는 왜 LAZY가 기본? 즉 JPA는 "하나를 조회하는 관계는 즉시 로딩, 여러 개를 조회할 수 있는 관계는 지연 로딩"이라는 방향을 가지고 있습니다.1. 왜 @OneToMany는 LAZY인가?예를 들어 아래와 같은 관계가 있다고 해보겠습니다. @Entitypublic class Member { @Id private Long id; private String name; @OneToMany(mappedBy = "member") private List orders = new ArrayList();} 회원 한 명이 여러 주문을 가지고 있는 구조입니다.DB에서는:MEMBERid | name---------1 | 김철수ORDERid | member_id | order_date-------------------..
h2 파일 생성 실패시, Database not found 애러 해결방법 Database "C:/Users/dhfle/jpashop2" not found, either pre-create it or allow remote database creation (not recommended in secure environments) jdbc:h2:~/jpashopp;AUTO_SERVER=TRUE 를 입력했더니 해결되었어. 이것의 의미가 뭐야?해결됐다니 다행이야.AUTO_SERVER=TRUE는 H2의 자동 서버 모드(Auto Mixed Mode) 를 활성화하는 옵션이야.네가 입력한 URL:jdbc:h2:~/jpashopp;AUTO_SERVER=TRUE 의 의미를 분해하면:1. jdbc:h2:~/jpashopp~=C:\Users\dhfle 따라서 실제 DB 파일은C:\Users\dhfl..