<항해99>JPA란?[TIL.220521]

박건영(Parkgunyoung)·2022년 5월 21일
0

til

목록 보기
7/17

JPA란?

JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨)

<DB 작성법>

DB에서 테이블은 자바용어로 Domain
SQL은 Repository 이다**

메인 패키지에 domain 패키지 생성 후 테이블 이름으로 Class 생성(행에 들어갈 내용), 테이블 이름 + Repository로 인터페이스 생성(들어갈 DB내용)

@Entity는 테이블을 나타냄

@Id 는 아이디 값으로 KEY로 사용하겠다는 것



SQL에서의 bigint는 자바에서 Long, vachar는 String

@GenerateValue(strategy=GenerationType.Auto)는 Id가 생성되는 방법(strategy)이 자동으로 증가되도록 해줘! 라는 AUTO_INCREMENT 와 같은 것이다.

@Column(행:가로)부분은 하나의 데이터베이스 테이블의 가로 부분이 되는 것이고(제목, 이름, 나이, 성별, 직업 등등 을 표시하는 부분) 열 부분에 Column에 해당하는 데이터 들이 들어감.

(nullable= false)는 이부분이 null이 될 수 있냐는 부분에 false를 준다.(NOT NULL 과 같음)


< Tip >
Id는 DB에서 쓰이는거라 getter&setter를 설정해주지 않음!(이거는 잘 이해가 가지 않아서 추가적으로 공부해보자!)
나머지 @column에 해당되는 부분에만 getter를 설정해주고 setter를 설정안하는 이유는
나중에 Repository 라는 부분에서 자동으로 해주기 때문이다!


<인터페이스란?>

클래스에서 멤버가 빠진, 메소드 모음집이다!
메소드가 잔뜩 모여 있는 곳이라고 생각하면 될 것 같다!
JPA를 사용할 경우 Repository 인터페이스는 JPA에서 작성되어진 메소드들을 가져다쓰는 것으로 이해하자!

<SQL 이 보이도록 application.properties 세팅하는법>

위와 같이 main.java.resourcese.application.properties 에 spring.jpa.show-sql=true 를 넣어준다!


<SQL에 데이터 저장하고 불러오기>

데이터를 입력하고 저장하고 불러오기 등등 은 메인 폴더의 서버 실행 파일에 main 밑에 입력을 해준다. 다음은 저장을 하고 데이터를 불러오는 형식의 코드인데. 불러오기를 할 때 아래와 같이 실행을 해본다.

모든 데이터를 불러올 때 DB에 저장 되어져 있는 리스트를 repository.findAll(); 을 이용하여 모두 찾아준다. 그리고 for문을 이용하여 데이터를 가져올 때 다음과 같이 리스트(찾아온데이터).get(i);를 하게되면 모두 찾아와서 콘솔창에 찍어줄 것 같지만 아니다...!

이렇게 하면 위와 같이 @샬라샬라 하면서 주소 값을 배출해버린다…

그 이유는 다 가져오긴 하는데 column(행:타이틀이라던가 튜터라던가)의 어떤거를 가져올건지 명시를 안해주어서 그렇다고 한다.

내가 이해한게 맞다면 약간 JASON 형식에서 Key : Value 가 있다면 어떤 Key를 불러올거냐를 말해줘야 콘솔창에 key에 해당되는 value를 콘솔에 찍어주는 것 같다!


<그럼 어떻게 해야 하느냐!?>

@SpringBootApplication
public class Week02Application {

    public static void main(String[] args) {SpringApplication.run(Week02Application.class, args);}
    // Week02Application.java 의 main 함수 아래에 붙여주세요.
    @Bean
    public CommandLineRunner demo(CourseRepository repository) {
        return (args) -> {

            //데이터 입력하고 저장하기
            Course  course1 = new Course("웹개발의 봄", "박건영");
            //repository.을 이용해 쿼리를 해온다
            repository.save(course1);
            //데이터 불러오기기
           List<Course> courseList = repository.findAll();
            for(int i =0; i<courseList.size();i++){
//                System.out.println(courseList.get(i)); // 이렇게 하면 안되고 정확하게 어떤 column 을 불러올껀지 말해줘야뎀
                Course c = courseList.get(i);
                System.out.println(c.getTitle());
                System.out.println(c.getTutor());
            }

        };
    }


}

위처럼 우선 변수선언(?정확한 명명은 아직 헷갈린다…) Course c 하나 만들어주고 아까처럼 찾은거를 .get(i)를 이용해 다 가져온다. 그리고 sout에 key값에 해당되는 부분을 명시해준다 .getTitle 이라던가 .gettutor 라던가 등등.

그럼 이렇게 뾰로롱 내가 저장한 데이터를 콘솔에 갖다바쳐준다. ㅎㅎ


<DB의 핵심은 생성일자와 수정일자!>

이걸 DB에 띄우기 위해선 몇 가지? 작업이 필요하다.
우선 domain 패키지에 클래스를 하나 생성하고 이름은 Timestamped 라고 지어준다.

그리고 아래와 같이 코드를 작성해 준다!

@MappedSuperclass // 이  클래스를 상속했을 때,Timestamped의 멤버변수가 있을텐데 이것도 컬럼으로 인식해줘! 라는 뜻
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
// @EntityListeners는 Course클래스의 table을 나타내는 @Entity를 주시하라는 것
//AuditingEntityListener 뭔가 수정이 일어나면 반영하라는 것임
public abstract class Timestamped { // Timestamped 는 createdAt 와 modifiedAt 이라는 멤버변수 2개를 가짐
    // class 앞에 abstract 붙여주면 직접구현 안되고 상속으로만 사용가능하다 라고 말하는 것!
    // 즉 extends(class를 상속할때는 extends) Timestamped 이렇게 만 사용가능하고 new Timestamped 이러면 오류남.

    @CreatedDate // 생성일자임을 나타냅니다.
    private LocalDateTime createdAt; //LocalDateTime은 시간을 나타내는 자바의 자료형 중 하나이다.

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
    private LocalDateTime modifiedAt;
}

(주석부분은 다시 이 글을 읽으면서 공부할 때 부연설명을 추가해 두었다!)

이렇게 Timestamped 라는 클래스를 생성해준 후
실행 서버를 실행시켜주는 실행 클래스로 가서

@EnableJpaAuditing // 이걸해줘야 Timstamped와 연동되어 수정일자가 완벽하게 반영이 됨!
@SpringBootApplication
public class Week02Application {

@EnableJpaAuditing 이라는 어노테이션을 넣어주면 끝!
다시 서버를 재실행 시키고 h2-console에서 확인해보자!

그럼 이렇게 Timestamped가 잘 작동하여 생성일자와 수정일자가 표시되는 것을 확인할 수 있다! 생성일자는 고정이되고 앞으로 수정을 하게 되면 수정일자와 시간이 변경될 것이다!

profile
쓰러지면어때일어나면그만인걸

1개의 댓글

comment-user-thumbnail
2022년 9월 5일

좋은 글 잘 보고 갑니다.

답글 달기