전환: JDBC vs Spring Boot (JPA)
자바에는 JDBC를 직접 이용하며 SQL문을 작성하지 않아도, Spring boot와 Spring data JPA로 다룰 수 있다.
JPA란? (Java Persistence API)
역할: 자바 객체(Object)를 DB에 저장할 때 사용하는 새로운 표준 기술이자 자동화 도구
| 비교 항목 | 🐢 JDBC (Legacy) | 🚀 Spring Data JPA (Modern) |
| SQL 작성 | 개발자가 직접 작성 (String 형태) | 자동 생성 (메서드 호출 시 알아서 나감) |
| 코드 양 | 길고 반복적임 (Connection 열고 닫기 등) | 매우 간결함 (비즈니스 로직에 집중) |
| 유지 보수 | DB 컬럼 변경 시 쿼리 수정 지옥... 😱 | 객체 필드만 수정하면 끝! 😎 |
| 패러다임 | 데이터 중심 (SQL 의존적) | 객체 지향 중심 (Java 객체 = DB 테이블) |
SQL문을 몰라도 DB를 다룰 수 있다!
=> 자바 객체와 메서드만 신경쓰면 됨
@Entity
해당 클래스를 DB 테이블과 매핑 해주는 어노테이션
클래스 이름 == 테이블 이름
필드 변수 == 컬럼
@Entity //1. JPA가 관리하는 객체 선언
@Table(name = "users")//내 테이블 이름은 users라서 테이블 name을 따로 설정함
public class User {//테이블 이름
@Id//2. Primary Key(고유 키)
@GeneratedValue(strategy = GenerationType.IDENTITY)// 자동 증가 (Auto Increment)
private int id;
@Column
private String name;
private int age;
public User() {} //기본생성자 반드시 넣어줌
// ID 없이 생성자 (INSERT 시 사용)
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 전체 필드 생성자 (UPDATE, SELECT 시 사용)
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
CRUD API 흐름
//Controller 코드
@PostMapping("/submitForm") //입력폼과 연결
public User submit(@RequestParam(name="name") String name, @RequestParam(name="age") int age) {
System.out.println(name+ ":" + age);
return service.create(new User(name, age)); //객체로 생성해서 DB생성
}
//서비스 코드
public User create(User user) {
return repository.save(user);//repositoy 사용
}
자바 객체와 메서드만 신경 쓰면, SQL은 알아서 나간다.
데이터 흐름
상황: 사용자가 폼에 이름(Jimin)과 나이(25)를 입력하고 '전송' 버튼을 누름!
실습: Spring data JPA: DB 연동 및 CRUD API
1. 요청 (Client → Controller)
- 사용자가 웹 브라우저(입력폼)에서 전송 버튼을 누름
- 데이터(name=Jimin, age=25)가 http://.../user/submitForm 주소로 날아감
- SpringDBController의 submit 메서드가 이 요청을 낚아챔.
- @RequestParam이 폼에서 보낸 데이터를 받아서 변수(String name, int age)에 담는다.
2. 객체 생성 및 전달 (Controller → Service)
// Controller 내부
return service.create(new User(name, age));
- 컨트롤러는 받은 이름과 나이로 new User 객체를 하나 만듭니다. (아직 ID는 없음, null 상태)
- 이 객체를 service.create()에게 넘기며 "이거 저장해"
3. 저장 요청 (Service → Repository)
// Service 내부
return repository.save(user);
- 서비스는 특별한 비즈니스 로직이 없다면, 바로 repository.save(user)를 호출하여 DB 처리
4. DB 저장 및 반환 (Repository ↔ DB) ⭐️ 핵심!
- JPA(Repository)가 DB에 INSERT SQL을 날려 데이터를 저장
- 여기서 중요: DB는 저장을 완료하면, 방금 저장된 데이터(ID가 생성된 완벽한 상태)를 다시 리포지토리에게 돌려줍니다.
- 가기 전: User {id=null, name="Jimin", age=25}
- 갔다 온 후: User {id=1, name="Jimin", age=25} (ID가 생겨서 돌아옴!)
5. 결과 리턴 (Repository → Service → Controller)
- 방금 DB에서 주민등록번호(ID)를 발급받은 따끈따끈한 User 객체가 역순으로 돌아옴.
- Repository -> Service -> Controller 순서로 return
#실습

Entity 클래스
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private int age;
public User() {} //기본생성자 반드시 넣어줌
// ID 없이 생성자 (INSERT 시 사용)
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 전체 필드 생성자 (UPDATE, SELECT 시 사용)
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
UserRepository 클래스(DB관리)
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import kr.ac.ewha.java2.entity.User;
@Repository
public interface UserRepository extends JpaRepository<User,Integer>{
}
extends JpaRepository<User, Integer> 이걸 상속받는 순간 save(), findById(), findAll(), delete() 같은 기본적인 CRUD 메서드가 자동으로 생성되어 사용할 수 있게 된다. 구현체(Class)를 따로 만들 필요가 없다.
롬복(LomBok)
1. 롬복(Lombok)이란?
- 정의: 자바 컴파일 시점에 반복적인 코드(Boilerplate code)를 자동으로 생성해 주는 라이브러리.
- 역할: 개발자가 일일이 작성해야 하는 Getter, Setter, ToString, Constructor(생성자) 등을 어노테이션 하나로 대신 작성해 줌.
롬복 적용 코드
import lombok.*;
@Getter // 모든 필드의 Getter 자동 생성
@Setter // 모든 필드의 Setter 자동 생성
@NoArgsConstructor // 기본 생성자 자동 생성
@AllArgsConstructor // 모든 필드 포함 생성자 자동 생성
@ToString // toString() 자동 생성
public class User {
private String name;
private int age;
}
JPA를 쓰면 쿼리를 자바 코드로 대신할 수 있다. DB를 자바에서 객체 다루 듯이 쓸 수 있다는 점이 장점인 것 같다. 객체지향성을 고려하면서 코드를 짤 수 있어서, DB관리 코드가 더 직관적이게 바뀐다.
'자바' 카테고리의 다른 글
| week 12: DB & JDBC (0) | 2025.11.16 |
|---|---|
| week10: 자바 네트워크 (0) | 2025.11.09 |
| week9.java GUI_Swing, Event 실습 (0) | 2025.11.02 |
| week5: 자바 SOLID원칙 (0) | 2025.10.03 |
| week4: 자바 Thread -2 (0) | 2025.10.01 |