자바

week14: CRUD

aerimi-code 2025. 11. 29. 15:53

 

전환: 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