2. JPA Basic

안녕! 안녕!
지난 시간에는 JPA를 사용하기 위해 선행되는 코드들을 먼저 살펴보았다.
일차적으로는 자바에서 SQL문의 빈도를 최소화하기 위해 사용한다고 했지?
솔직히 이 녀석은 프레임워크에 포함된 수많은 라이브러리 중 하나에 불과하다.
그런 주제에 실상은 인터프리터의 탈을 뒤집어 쓰고 있다고 해도 과언이 아니지.
마치 자바보다는 좀 더 유저 친화적인 파이썬처럼 말이다.
이번 시간부터는 본격적으로 JPA를 핸들링 해보도록 하자.
아직까지는 수박 겉핥기 수준이니, 필요한 부분만 적절히 취사하길 바란다.
뭐.. 여기까지 들어오신 분들이라면 자바 스크립트 비활성화를 모를리가 없겠지?
그래서 쓰잘데기 없이 우클릭을 막아놓고 그러지는 않았다.
우선 교보재로는 IntelliJ를 쓸 것이다.
물론 이클립스로도 가능하지만 편의성 측면에서 제트브레인 제품을 강추한다.
본인 출신 학교 이메일 계정만 있으면 1년동안 Ultimate 버전을 무료로 쓸 수 있다.
굳이 불편함을 감수하려 들지 말자.
1. 저장 / 조회 (UPDATE / READ)
웹 개발을 하면서 C.R.U.D 네 가지 기능을 모르면 시작부터 진입장벽을 마주하게 된다.
뿐만 아니라 개발자들끼리의 프로토콜이나 다름없는 API를 읽을 수 조차 없게 된다.
JPA를 공부하기 위해 굳이 여기까지 찾아오신 분들은 기본적으로 숙지하고 있는 내용이겠지만..
아직 개념적으로 미숙하신 분들은 지금 당장 구글링부터 시작하기 바란다.
본인이 텍스트에 약하다면 유튜브에도 쉽고, 재밌게 설명해주시는 분들 쌔고 쌨으니 걱정 말고!
기왕 공부하는 김에 POST / PUT / UPDATE / DELETE까지 같이 조사해보면 좋을 것이다.
어짜피 그게 그거다.
최종적으로는 API를 이해하는 단계까지는 도달해야 본문을 이해하기 수월할 것이다.
그렇다면 JPA에서 가장 기본적이면서, 동시에 가장 많이 쓰이는 기능들을 먼저 살펴보도록 하자.
Course course = new Course("웹 개발의 봄, 스프링","코드 오타쿠");
repository.save(course);
// INSERT INTO COURSE ("ID", 'TITLE', 'TUTOR') VALUES (?, ?, ?);
repository.save(); 가 핵심이다.
갑자기 왠 레퍼지토리?
package com.sparta.week02.domain;
// This Package contains table
import org.springframework.data.jpa.repository.JpaRepository;
public interface CourseRepository extends JpaRepository<Course, Long> {
// This Class represents SQL in DB server.
// Parent Class: Course.java
// Data type of id is Long.
// JpaRepository can be used only in Interface.
// Interface only contains methods without member variable.
}
앞선 챕터에서 이 녀석을 다뤄본 적이 있다.
서플라이 디폿같은 녀석이라고 했지?
JPA를 사용하기 위해서 JpaRepository 클래스를 상속하고 있는 CourseRepository.java 클래스를 호출하고 있는 것이다.
Course course = new Course("웹 개발의 봄, 스프링","코드 오타쿠");
repository.save(course);
// INSERT INTO COURSE ("ID", 'TITLE', 'TUTOR') VALUES (?, ?, ?);
다시 돌아가보자..
문법 자체는 별 거 없다.
SQL에 대한 사전지식이 있다면 하단에 달아놓은 코멘트만 봐도 얼른 이해가 될 것이다.
그래도 SQL을 모르고 있는 독자들을 대상으로 이야기를 해야겠지?
안그래도 구글링 하고 오느라 심사가 뒤틀려 있을텐데..
public class Course {
// This Class represents table in DB server.
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String tutor;
(중략)
}
사실상 이번 프로젝트의 몸통이나 다름없는 Couse.java 클래스이다.
id는 중복을 허용하지 않겠다는 의미에서 PK 값으로 선언했고..
정작 우리가 가져다가 쓸 멤버변수들은 title과 tutor이다.
Course course = new Course("웹 개발의 봄, 스프링","코드 오타쿠");
그러기 위해서는 변수를 새로 생성해줘야겠고..
repository.save(course);
title과 tutor에 각각 값을 저장 (Save: UPDATE) 해주고 있다.
컬럼에 새로운 값을 밀어넣어주는 문법인 것이지.
ID | TITLE | TUTOR |
1 | 웹 개발의 봄, 스프링 | 코드 오타쿠 |
그렇다면 백이면 백, 이런 방식으로 테이블이 만들어지고 (CREATE)
ID / TITLE / TUTOR의 값이 각각 입력될 것이다.
여기서 그런갑다.. 하고 넘어가려고 하면 여러분은 아직 개발자로서 갈 길이 멀었다고 할 수 있다.
필자가 약을 팔고 있는 것은 아닌지 확인해봐야 할 거 아닌가?
List<Course> courseList = repository.findAll();
// SELECT * FROM COURSE
for(int i=0 ; i<courseList.size() ; i++){
Course course1 = courseList.get(i);
System.out.println("강의 제목: " + course1.getTitle());
System.out.println("담당 튜터: " + course1.getTutor());
}
SELECT * FROM 테이블 이름;
SQL에서 필요한 데이터를 전부 조회하고자 할 때 쓰는 문법이다.
솔직히 필자라면 여기서 굳이 JPA를 고집하기보다는 SQL문을 쓸 것 같다.
오히려 코드가 더 길어지지 않았는가?
그래도 우리는 JPA를 공부하는 입장이기 때문에 다소의 불편함은 감수하기로 하자.
repository.findAll();
이번에도 repository 메서드가 핵심기능을 수행하고 있다.
한 눈에 보기에도 직관적인 것이 꼭 파이썬을 쓰고 있는 것 같지?
세미클론만 빼면 말이다.
List<Course> courseList
우리가 Course.java 클래스에서 조회할 데이터가 하나가 아니기 때문에 굳이 배열 형태로 변수를 선언해줬다.
for(int i=0 ; i<courseList.size() ; i++){
Course course1 = courseList.get(i);
System.out.println("강의 제목: " + course1.getTitle());
System.out.println("담당 튜터: " + course1.getTutor());
}
배열에서 리스트를 뽑아내는 방법으로는 사실상 for문이 유일하다.
for문을 돌리는 형식은 자바, 파이썬, 스크립트 가리지 않고 거의 유사하다.
JPA의 기능을 소개하는 파트이기 때문에 너무 기초적인 문법은 따로 다루지 않겠다.

여기까지 JPA에서 가장 기초적이면서도 빈번하게 쓰이는 기법에 대해 살펴보았다.
데이터를 저장하고 조회하는 기능.
더 나아가 수정하고 삭제하는 기능까지!
SQL에서 수행하는 거의 대부분의 기능을 JPA는 직관적인 문법을 통해 간단하게 DB 서버로 전달해준다.
여기까지 살펴보면서 뭐 느껴지는 게 없는가?
필자가 최대한 이해하기 쉽게 글을 풀어쓰기는 했지만..
SQL에 대한 최소한의 개념조차 없는 분들은 감이 잡힐 듯, 말 듯 할 것이다.
우리가 일반적으로 사용하는 Java, Python, Ruby, C++, 등등..
거의 대부분의 언어들이 RDBMS에 친화적으로 설계되었다.
특히 C++이나 C#처럼 C에서 파생된 녀석들도
객체지향형 언어의 한계를 극복하기 위해 만들어졌다고 해도 과언이 아니다.
비록 필자가 블로그에서 SQL을 다루지 않더라도 따로 시간을 내서 공부하는 게 좋겠지?
같은 SQL만 하더라도 종류가 너무나도 많다.
특히 요즘은 MongoDB, MariaDB 등과 같은 NO-SQL을 기술스텍으로 넣는 회사들도 많은 것 같다.
그 외에는 MySQL이 가장 많이 쓰인다.
공짜니까.. ㅋㅋㅋㅋ
하지만 은행이나 관공서 같은 부류의 직군들은 선택의 여지없이 비싼 돈 주고 Oracle을 써야 한다.
우선 필자는 Oracle을 먼저 공부했다.
다소 유행에서 뒤쳐진 감이 있지만..
어짜피 오라클 하나 다룰 줄 알면 나머지는 비슷비슷하다.
독자 여러분들이 선택하기 나름이지만
필자는 입문용으로 Oracle이 제격이라고 생각한다.
참고할 만한 책도 하나 추천해주겠다.
프론트엔드는 코드의 수명이 워낙에나 짧기 때문에 선뜻 추천해주기가 거시기하지만..
백엔드 개발자라면 전공서적 하나 붙잡고 끈덕지게 파고드는 것이 가장 좋은 공부 방법이다.
http://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791163030300
Do it! 오라클로 배우는 데이터베이스 입문 - 교보문고
비전공자도 기초부터 확실하게! | 기초가 탄탄해야 실무에서 인정받습니다!실무에서 많이 쓰는 순서대로 기본기를 익히세요.현업 프로그래머 저자가 개념부터 SQL, PL/SQL까지 확실하게 기본기를
www.kyobobook.co.kr