이기에 가능한 일
class Car {
String color = "white";
int door = 4;
void drive() {
System.out.println("drive");
}
void stop() {
System.out.println("stop");
}
}
class FireEngine extends Car {
int door = 6;
int wheel = 10;
void drive() { // 오버라이딩
System.out.println("more fast drive~");
}
void water() {
System.out.println("water~");
}
}
이와 같이 되어 있는 코드에서
Car c = new FireEngine(); //자동 형변환
이후, c.drive()를 한다면?
부모타입 클래스이지만, 자식타입에서 오버라이딩 했기 때문에 자식의 것이 호출되어
"more fast drive~" 가 찍힌다.
하지만 c.wheel 과 같이 자식클래스로의 접근은 불가하다.
아래 코드로 다시 한번 확인 할 수 있다.
class Animal {
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
void makeSound(String sound) {
System.out.println("강아지가 " + sound + " 소리를 냅니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal myPet = new Dog();
myPet.makeSound(); // Animal.makeSound() 가 실행된다.
// myPet.makeSound("왈왈 크르릉"); // 사용할 수 없다.
Dog dog = new Dog();
dog.makeSound(); // 부모 Animal 클래스의 makeSound() 가 실행된다.
dog.makeSound("왈왈 크르릉"); // Dog 클래스의 makeSound() 가 실행된다.
}
}
Product[] arr = {
new Product("P01", "제조사"),
new Computer("C02", "삼성", "window10", 64),
new Book("B03", "중앙출판사", "자바", "이무진")
};
오버로딩: 이름은 같지만 시그니처(파라미터 수, 타입)는 다른 메소드를 중복으로 선언하는 것을 의미
오버라이딩: 부모 클래스의 메소드의 동작 방법을 변경(재정의)하여 우선적으로 사용하는 것이다.
오버라이딩엔 @Override 어노테이션을 생략 할 수는 있지만, 직접 명시함으로써 정확성을 검증 할 수 있다.
flush()는 변경 사항을 데이터베이스에 쓰는 작업을 수행하지만, 트랜잭션을 확정(커밋)하지 않습니다. 따라서 flush()만 호출하면 변경 사항이 데이터베이스에 반영되긴 하지만, 해당 트랜잭션이 완전히 확정되지 않습니다. 그래서 데이터베이스에서 이러한 변경 사항이 영구적으로 저장되지 않습니다.
트랜잭션을 확정하려면 commit() 메서드를 명시적으로 호출해야 합니다. commit()을 호출할 때 트랜잭션의 변경 사항이 영구적으로 데이터베이스에 저장되며, 트랜잭션은 종료됩니다. 만약 commit()을 호출하지 않고 트랜잭션이 롤백되면, flush()를 통해 데이터베이스에 쓰인 변경 사항도 롤백되어 이전 상태로 복구됩니다.
쉽게 말해서 flush()는 캐시에 넣어만 놓은 상태로만 있게 하는 것임.
SQL을 JDBC를 사용해서 직접 실행해줘야 합니다.
SQL 결과를 객체로 직접 만들어줘야 합니다.
SQL 의존적이라 변경에 취약합니다 (MemoResponseDto 객체에 값을 넣어주는 부분 등도 수정)
--> ORM (Object-Relational Mapping) 객체와 DB를 연결해주는 도구이다.
반복적이고 번거로운 애플리케이션 단에서의 SQL 작업을 줄여주기 위해서 ORM(객체 관계 매핑)기술들이 등장.
JPA는 Java ORM 기술의 대표적인 표준 명세입니다.
JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준이 하이버네이트(Hibernate)입니다.
• JPA에서 관리되는 클래스 즉, 객체를 의미합니다.
• Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리됩니다.
Persistence를 객체의 관점으로 해석해 보자면 ‘객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질’을 의미합니다.
즉, Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간
DB소통이라는 일련의 과정을 효율적으로 처리하기 위해 JPA는 영속성 컨텍스트에 Entity 객체들을 저장하여 관리하면서 DB와 소통합니다.
개발자들은 EntityManager를 사용해서 Entity를 저장하고 조회하고 수정하고 삭제할 수 있습니다.
• EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용됩니다.
• EntityManagerFactory를 만들기 위해서는 DB에 대한 정보를 전달해야합니다.
(정보를 전달하기 위해서는 /resources/META-INF/ 위치에 persistence.xml 파일을 만들어 정보를 넣어두면 됩니다.)
아래 나온 사진의 "memo"처럼 이름이 동일하게 설정되어 있어야 createEntityManagerFactory 메서드가 잘 받아올 수 있음.
• 트랜잭션은 DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념입니다.
(쉽게 표현하자면 DB의 데이터들을 안전하게 관리하기 위해서 생겨난 개념입니다.)
• 가장 큰 특징은 여러 개의 SQL이 하나의 트랜잭션에 포함될 수 있다는 점입니다.
• 이때, 모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 변경을 반영하지만 SQL 중 단 하나라도 실패한다면 모든 변경을 되돌립니다.
--> commit 으로 트렌젝션을 끝내기 전까진 DB에 데이터가 가지 않음(트렌젝션에서 조회하면 들어간 데이터가 조회는 됨). 커밋하면 DB에 데이터가 들어감.
JPA는 DB의 이러한 트랜잭션 개념을 사용(도입)하여 효율적으로 Entity를 관리하고 있습니다.