💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 엔티티 매핑 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑: @Column 기본 키 매핑: @Id 연관관계 매핑: @ManyToOne, @JoinColumn 1. 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리함. 엔티티라고 부른다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수로 써야함 💡 주의 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @Entity 속성 속성 : name JPA에서 사용할 엔티티 이름을 지정한다. 기본값: 클래스 이름을..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 영속성 컨텍스트란? 💡 영속성 관리 (JPA 내부 구조) JPA를 이해하기 위해 영속성 컨텍스트를 이해해야 함 JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping) 영속성 컨텍스트 EntityManagerFactory와 EntityManager 1. EntityManagerFactory JPA는 EntityManagerFactory를 이용하여 entity를 관리한다. 어플리케이션 로딩 시점에 DB당 딱 하나만 생성되야 한다. WAS가 종료되는 시점에 EntityManagerFactory를 닫는다. 2. EntityManager 트랜잭션이 수행되는 단위마다 생성한다. 즉, 고객의 요청이 들어올..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. JPA 시작하기 전에.. JPA - 프로젝트 생성 H2 데이터베이스 최고의 실습용 DB이다. 가볍다. (1.5MB) 웹용 쿼리툴 제공한다. MySQL, Oracle 데이터베이스 시뮬레이션 기능을 제공한다. 시퀀스, auto increment 기능 지원한다. 간단하게 db를 띄우지 않고 메모리로 실행할 수도 있다. 데이터베이스 방언 JPA는 특정 데이터베이스에 종속 X 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다. 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR() 페이징 : MySQL은 LIMIT, Oracle은 ROW..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. JPA란? JPA(Java Persistence Api) = 자바 진영의 ORM 기술 표준 ORM (Object Relational Mapping) = 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크가 객체와 관계형 데이터베이스 중간에서 매핑해줌 대중적인 언어에 대부분 ORM 기술이 존재함 (ex : typescript도 type orm으로 제공한다.) 📕 어플리케이션과 JDBC 사이에서 동작한다. ⛏ JPA 동작 - 저장 ⛏ JPA 동작 - 조회 JPA 소개 [History] EJB-엔티티 빈 (자바 표준) -> 하이버네이트 (오픈 소스) -> JPA(자바 표준) 💻 JPA는 표준 명세 JPA는 인터페이스의 모음이다. (껍데기) JP..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 객체 지향 언어와 관계형 데이터 베이스 객체 지향 언어를 이용한 애플리케이션은 보통 관계형 데이터 베이스에서 관리한다. 그러다 보니 SQL 중심적인 개발이 주를 이루게 된다. (CRUD → 지루한 코드를 무한 반복 함) 예를 들어 회원 객체를 만들었다면, 그에 해당하는 SQL을 짜게 되는데 만약 개발하다가 필드가 추가되면 짜놓은 SQL 쿼리들을 하나씩 다 수정해야 한다.. 즉, SQL에 의존적인 개발을 피하기 어렵다. 또, 객체와 관계형 데이터 베이스 사이의 패러다임의 불일치가 발생한다. 🤔 객체를 어떤 저장소에 보관해야 할까? RDB, NoSQL, FILE 등이 있는데, 현실적으로 FILE에 넣으면 검색을 할 수 없다. NoSQL은 대안이 될 수 있지..
빌드 툴인 gradle을 이용하여 의존성을 등록할 수 있다. build.gradle repositories { mavenCentral() } dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' } 'org.junit.jupiter:junit-jupiter-api:5.6.0'와 'org.junit.jupiter:junit-jupiter-engine' 라이브러리가 의존성 설치가 되도록 build.gradle에 등록되어 있다. 이 의존성 등록은 mavenCentral이라는 리포지토리에서 위 두 라이브러리에 대한 자료를 찾아..
NPE (Null Pointer Exception)은 가장 많이 발생하는 에러중 하나이다. 자바에서는 거의 모든것이 참조형이므로, 이는 다른말로 거의 모든것이 null이 될 수잇다. 그래서 항상 null을 확인할 필요가 있다. 이렇게 되면 굉장히 피곤해지게 되는데, 이거를 보완하기위해 이제 null을 쓰지 않기로 서로 약속하기로 한다. 근데 문법적으로 null을 없앨 수는 없고 (요즘은 null을 사용하면 error를 사용하기도 함) 그래서 notnull이나 nullable같은 애노테이션을 사용해서 null인지 아닌지 알아내서 문제를 막기도 한다. 어쨋든 개발자들끼리 null을 사용하지 않겠다고 서로 약속하고 프로그래밍을 하게 되는데, (계약 기반 프로그래밍) null을 쓰지 않는 방법으로 여러가지가 있..
자바에서는 collection 객체들에 대해서 stream으로 사용하는 방법을 제공해 준다. (이 stream은 자바 8 이상부터 사용 가능) 물론 System.in 과 System.out도 스트림이고, 우리가 계속 사용해왔던 거지만 자바 8에서 말하는 stream과는 다르다. 자바 8에서의 stream의 데이터의 스트림을 의미한다. 즉, Collections.stream()을 제공해 준다. 이 stream을 이용해서 collection의 데이터를 연속된 흐름으로써 취급할 수 있게 된다. stream에서는 filter, map, forEach 같은 고차함수(함수를 인자로 받는 함수)가 제공 됨 public class Main { public static void main(String[] args) { A..
자바에서 Collection 프레임워크를 제공하는데, 여기서 Collection의 뜻은 데이터의 묶음 이다. Collection 은 인터페이스(추상체)이다. 컬렉션의 구상체로 List가 있고, List의 구상체로 LinkedList, ArrayList, Vector, Stack이 있다. 마찬가지로 컬렉션의 구상체로 Set이 있고 Set의 구상체로 HashSet이 있다. LinkedList list1 = new LinkedList(); // LinkedList는 List 추상체를 구현한 것이므로 List 인터페이스로 표현할 수 있다. (다형성) List list2 = new LinkedList(); // ArrayList는 List 추상체를 구현한 것이므로 List 인터페이스로 표현할 수 있다. (다형성)..
자바 8에서 함수라는 단위가 계속 언급되고 있다. 거기서 함수형 인터페이스 라는 키워드가 등장하게 된다. 우선 이 함수형 인터페이스가 무엇인지 살펴보자. // 특별히 함수형 인터페이스라는 걸 알려주기 위한 애노테이션을 달아주기도 함 @FunctionalInterface public interface MyRunnable { void run(); // 추상 메소드가 하나밖에 없는 메소드 == 함수형 인터페이스 } // 얘는 추상 메소드가 2개이므로 함수형 인터페이스가 될 수 없다. interface MyRunnable2 { void run1(); void run2(); } // 얘도 함수형 인터페이스다. 왜냐면 '추상' 메소드는 하나이기 때문이다. // default, static method가 있는 것은 ..
현재 인터페이스는 굉장히 많은 형태로 사용되고 있다. 그러다보니 인터페이스의 단점들이 드러나기 시작하였고 그것을 해결하기위해 나온것이 디폴트 메서드(default method) 이다. 우선 default method의 역할을 살펴보자. 디폴트 메소드를 사용하면 인터페이스가 구현체(메소드의 구현부)를 가질 수 있게 된다. interface MyInterface { // 추상 메소드로만 이뤄진 클래스 == 인터페이스 void method1(); // 구현이 없다 : 추상 메소드 default void sayHello() { // 구현이 있다 (자바 8 부터 이런 구현 메소드를 인터페이스가 가질 수 있다) 대신 default 키워드를 써줘야 함 System.out.println("Hello World"); }..
Object 클래스는 모든 클래스의 최고 조상이므로 모든 클래스는 Object클래스 메소드를 사용할 수 있다. 그중에서 가장 많이쓰이는 메소드인 equals, hashCode, toString를 정리해 보았다. 1. equals 아래 코드는 Object 클래스에 정의 되어 있는 equals 메서드의 실제 내용이다. public boolean equals(Object obj) { return (this == obj) // 주소 비교 } 즉, 객체 자신(this)과 주어진 객체(obj)의 주소값을 비교한다. public class Main { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); ..