💻 1. REST API란?
REST API는 Representational State Transfer의 약자로, 웹에서 자원을 효율적으로 교환하기 위해 만들어진 아키텍처 스타일이에요. 간단히 말해, 웹 애플리케이션이 서버와 데이터를 주고받는 방식 중 하나죠. RESTful한 시스템은 자원(Resource), 자원의 상태(Representation), 이 자원을 조작하기 위한 표준 HTTP 메서드(GET, POST, PUT, DELETE)를 사용해요.
💻 2. HTTP 메서드
REST API의 핵심은 HTTP 메서드를 사용해 자원과 상호작용하는 거예요. 주요 메서드에는 GET, POST, PUT, PATCH, DELETE 등이 있어요. 각 메서드는 특정 작업을 나타내요.
🛠️ GET
GET 메서드는 서버에서 자원을 가져올 때 사용해요. 보통 데이터를 조회(read)할 때 쓰죠.
GET /users
위와 같은 요청은 모든 사용자의 정보를 가져오라는 의미예요.
🛠️ POST
POST 메서드는 서버에 자원을 생성할 때 사용해요. 새로운 데이터를 추가(insert)할 때 쓰죠.
POST /users
{
"name": "John",
"email": "john@example.com"
}
이 요청은 새로운 사용자를 생성하라는 의미예요.
🛠️ PUT
PUT 메서드는 서버의 자원을 업데이트할 때 사용해요. 전체 자원을 교체하는 방식으로 이해하면 돼요.
PUT /users/1
{
"name": "John Doe",
"email": "john.doe@example.com"
}
이 요청은 ID가 1인 사용자의 정보를 전체적으로 업데이트하라는 의미예요.
🛠️ PATCH
PATCH 메서드는 서버의 자원을 부분적으로 업데이트할 때 사용해요. 일부 데이터만 수정할 때 쓰죠.
PATCH /users/1
{
"email": "new.email@example.com"
}
이 요청은 ID가 1인 사용자의 이메일만 업데이트하라는 의미예요.
🛠️ DELETE
DELETE 메서드는 서버의 자원을 삭제할 때 사용해요.
DELETE /users/1
이 요청은 ID가 1인 사용자를 삭제하라는 의미예요.
💻 3. JAVA로 REST API 사용하기
이제 Java로 REST API를 어떻게 사용하는지 예시 코드를 통해 알아보아요. Spring Boot 프레임워크를 사용해서 간단한 RESTful 웹 서비스를 만들어볼게요.
🛠️ Spring Boot 설정
먼저 Spring Boot 프로젝트를 생성하고, 필요한 의존성을 추가해요. build.gradle
파일에 다음과 같이 설정할 수 있어요.
plugins {
id 'org.springframework.boot' version '2.5.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
🛠️ 데이터 모델 생성
User 데이터를 나타내는 간단한 모델 클래스를 생성해요.
package com.example.demo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String email;
// getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
🛠️ 레포지토리 생성
JPA를 이용해 데이터베이스와 상호작용하는 레포지토리 인터페이스를 생성해요.
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Integer> {
}
🛠️ 컨트롤러 생성
이제 REST API의 엔드포인트를 정의하는 컨트롤러 클래스를 만들어볼게요.
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable int id, @RequestBody User user) {
return userRepository.findById(id)
.map(existingUser -> {
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
return userRepository.save(existingUser);
})
.orElseGet(() -> {
user.setId(id);
return userRepository.save(user);
});
}
@PatchMapping("/{id}")
public User partialUpdateUser(@PathVariable int id, @RequestBody User user) {
return userRepository.findById(id)
.map(existingUser -> {
if (user.getName() != null) {
existingUser.setName(user.getName());
}
if (user.getEmail() != null) {
existingUser.setEmail(user.getEmail());
}
return userRepository.save(existingUser);
})
.orElse(null);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable int id) {
userRepository.deleteById(id);
}
}
🛠️ 애플리케이션 실행
Spring Boot 애플리케이션을 실행하기 위해 메인 클래스를 설정해요.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
💻 4. JpaRepository에 대한 설명
UserRepository
인터페이스는 JpaRepository
를 확장해요. Spring Data JPA가 제공하는 JpaRepository
는 CRUD (Create, Read, Update, Delete) 작업을 위한 기본 메서드를 자동으로 구현해줘요. 주요 메서드들에는 다음과 같은 것들이 있어요:
save(S entity)
: 엔티티를 저장하거나 업데이트해요.findById(ID id)
: 주어진 ID로 엔티티를 찾아요.findAll()
: 모든 엔티티를 리스트로 반환해요.deleteById(ID id)
: 주어진 ID로 엔티티를 삭제해요.
이러한 메서드들은 SQL 쿼리를 직접 작성하지 않아도 데이터베이스와 상호작용할 수 있게 해줘요.
💻 5. JPA의 동작 원리
Java Persistence API (JPA)는 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 표준화한 인터페이스에요. JPA의 핵심 개념과 작동 방식은 다음과 같아요:
🛠️ 엔티티(Entity)
데이터베이스 테이블과 매핑되는 클래스에요. @Entity
어노테이션을 사용해 정의해요.
🛠️ 엔티티 매니저(Entity Manager)
엔티티의 생명주기를 관리해요. 엔티티를 데이터베이스에 삽입, 수정, 삭제, 조회하는 작업을 수행해요.
🛠️ 영속성 컨텍스트(Persistence Context)
엔티티 매니저가 관리하는 엔티티 인스턴스의 집합이에요. 엔티티가 영속성 컨텍스트 내에 있으면 "영속 상태"라고 해요.
🛠️ 트랜잭션(Transaction)
데이터베이스 작업의 논리적 단위에요. 모든 작업은 트랜잭션 내에서 이루어져야 해요. 트랜잭션은 원자성을 보장해요.
JPA는 이러한 개념을 바탕으로 동작하며, 개발자는 JPA를 통해 데이터베이스와의 상호작용을 쉽게 할 수 있어요.
💻 6. DeleteMapping의 동작 원리
@DeleteMapping
어노테이션은 단순히 HTTP DELETE 요청을 처리하는 메서드라는 것을 명시해줄 뿐이에요. 실제 데이터베이스에서 삭제 작업을 수행하는 것은 UserRepository
의 deleteById
메서드에 의해 이루어져요.
deleteById
메서드는 JPA 레포지토리 인터페이스의 기본 메서드 중 하나로, 엔티티의 ID를 인자로 받아 해당 엔티티를 데이터베이스에서 삭제해요. 이 메서드는 내부적으로 JPA가 제공하는 표준 SQL DELETE 쿼리를 생성하고 실행해요.
따라서, @DeleteMapping
어노테이션을 사용하면 Spring Boot는 해당 엔드포인트에 대한 HTTP DELETE 요청을 받았을 때, 자동으로 연결된 메서드를 호출하고, 그 메서드에서 deleteById
를 통해 데이터베이스 삭제 작업을 수행하게 돼요.
💻 7. REST API의 장점
REST API는 다음과 같은 장점들이 있어요:
- 확장성: 클라이언트와 서버의 독립성 덕분에 각기 따로 확장이 가능해요.
- 유연성: 다양한 데이터 형식을 지원해요 (JSON, XML 등).
- 가독성: URL과 HTTP 메서드를 사용해 직관적이에요.
- 성능: HTTP의 캐싱 기능을 사용할 수 있어 성능이 좋아요.
REST API는 현대 웹 개발에서 빼놓을 수 없는 중요한 기술이에요. GET, POST, PUT, PATCH, DELETE 같은 메서드를 잘 이해하고 활용하면, 효율적이고 확장 가능한 웹 서비스를 만들 수 있어요.
'Java' 카테고리의 다른 글
[JAVA] Java Stream API 활용법 (0) | 2024.09.02 |
---|---|
[JAVA] 자바 버전별 차이점 (0) | 2024.08.02 |
[JAVA] String Boot에서 AOP를 활용한 로그인 시스템 구현방법 (0) | 2024.05.16 |
[JAVA]Java에서의 Deque 소개 (0) | 2024.04.30 |
[JAVA] 컬렉션 정렬 방법 (1) | 2024.04.27 |