REST API란?

lavender_je
|2025. 4. 4. 17:04
728x90

REST API란?

1. REST의 개념

REST(Representational State Transfer)는 웹에서 자원을 효율적으로 관리하고 접근하는 아키텍처 스타일(설계 방식) 이다. REST는 HTTP 프로토콜을 기반으로 클라이언트와 서버 간의 통신을 설계하는 방식이며, 웹의 기존 기술과 HTTP의 장점을 활용한다.

 

1.1 REST의 기본 원칙

REST는 다음과 같은 원칙을 따른다.

  1. 자원(Resource) 기반 설계
    • 서버의 모든 데이터(예: 사용자, 게시글, 상품 등)는 자원(Resource) 으로 정의된다.
  2. URI(Uniform Resource Identifier)를 통해 자원 식별
    • 각 자원은 고유한 URI(예: /users, /posts/1)를 사용하여 접근한다.
    • 예: GET /users/1 → ID가 1인 사용자의 정보를 요청
  3. HTTP 메서드를 활용한 CRUD (Create, Read, Update, Delete) 지원
    • GET → 데이터 조회
    • POST → 데이터 생성
    • PUT → 데이터 전체 수정
    • PATCH → 데이터 일부 수정
    • DELETE → 데이터 삭제
  4. 무상태성(Stateless)
    • 서버는 요청을 처리할 때 클라이언트의 이전 상태를 기억하지 않는다. 즉, 요청이 독립적으로 처리된다.
  5. 캐시(Cache) 가능
    • REST API의 응답은 캐싱할 수 있어야 한다.
  6. 계층화 구조
    • API 요청이 여러 개의 계층을 통해 전달될 수 있다.

 


2. @RestController란?

2.1 @Controller vs @RestController

Spring에서는 REST API를 만들기 위해 @Controller와 @RestController 두 가지 어노테이션을 사용할 수 있다.

어노테이션 특징
@Controller HTML 페이지 반환 (View를 렌더링)
@RestController JSON 또는 XML 응답 (데이터 반환)

 

2.2 @RestController의 역할

  • @RestController@Controller + @ResponseBody를 합친 것이다.
  • JSON 형태의 데이터를 반환하는 REST API를 만들 때 사용한다.
  • View를 렌더링하지 않고, 데이터를 그대로 반환한다.

 

2.3 예제 코드

1) @Controller 사용 예시 (Thymeleaf 연동)

@Controller
public class MyController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "안녕하세요!");
        return "hello"; // hello.html 템플릿 반환
    }
}
  • /hello 요청이 오면 hello.html을 렌더링하여 반환한다.

 

2) @RestController 사용 예시 (JSON 반환)

@RestController
public class MyRestController {

    @GetMapping("/hello")
    public String hello() {
        return "안녕하세요!";
    }
}
  • /hello 요청이 오면 "안녕하세요!" 라는 문자열을 그대로 반환한다.

 

3) JSON 데이터 반환 예시

@RestController
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return new User(1, "홍길동", "hong@example.com");
    }

    static class User {
        private int id;
        private String name;
        private String email;

        public User(int id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }

        // Getter 추가 (JSON 변환을 위해 필요)
        public int getId() { return id; }
        public String getName() { return name; }
        public String getEmail() { return email; }
    }
}
 
  • /user 요청이 오면 JSON 데이터가 반환된다.
{
    "id": 1,
    "name": "홍길동",
    "email": "hong@example.com"
}

 


3. RESTful API 설계 예시

3.1 사용자(User) 관리 API 설계

기능 HTTP Method URL
사용자 목록 조회 GET /users
특정 사용자 조회 GET /users/{id}
사용자 등록 POST /users
사용자 수정 PUT /users/{id}
사용자 삭제 DELETE /users/{id}

 

3.2 구현 예제

@RestController
@RequestMapping("/users")
public class UserController {
    
    private final List<User> userList = new ArrayList<>();

    // 사용자 목록 조회
    @GetMapping
    public List<User> getUsers() {
        return userList;
    }

    // 특정 사용자 조회
    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        return userList.stream()
            .filter(user -> user.getId() == id)
            .findFirst()
            .orElse(null);
    }

    // 사용자 등록
    @PostMapping
    public User createUser(@RequestBody User user) {
        userList.add(user);
        return user;
    }

    // 사용자 수정
    @PutMapping("/{id}")
    public User updateUser(@PathVariable int id, @RequestBody User updatedUser) {
        for (User user : userList) {
            if (user.getId() == id) {
                user.setName(updatedUser.getName());
                user.setEmail(updatedUser.getEmail());
                return user;
            }
        }
        return null;
    }

    // 사용자 삭제
    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable int id) {
        userList.removeIf(user -> user.getId() == id);
        return "삭제 완료";
    }

    static class User {
        private int id;
        private String name;
        private String email;

        // 생성자
        public User(int id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }

        // Getter 및 Setter 추가
        public int getId() { return id; }
        public String getName() { return name; }
        public String getEmail() { return email; }

        public void setName(String name) { this.name = name; }
        public void setEmail(String email) { this.email = email; }
    }
}
 

3.3 API 요청 예시

1) 사용자 등록

  • 요청 (POST /users)
{
    "id": 1,
    "name": "홍길동",
    "email": "hong@example.com"
}
  • 응답
{
    "id": 1,
    "name": "홍길동",
    "email": "hong@example.com"
}

 

2) 사용자 조회

  • 요청 (GET /users/1)
  • 응답
{
    "id": 1,
    "name": "홍길동",
    "email": "hong@example.com"
}

 

 


4. 결론

  • REST API는 웹에서 데이터를 효율적으로 관리하는 방식이다.
  • @RestController는 데이터를 JSON 형식으로 반환하는 역할을 한다.
  • REST API 설계에서는 자원(Resource), URI, HTTP 메서드를 적절히 활용해야 한다.
  • @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등을 사용하여 API를 구현할 수 있다.

 


+ @RestController에 대한 자세한 내용이 궁금하다면?👇

https://lavenderje.tistory.com/311

 

@Controller와 @RestController의 차이

✅ 1. @Controller📌 View(HTML)를 반환하는 컨트롤러📌 주로 Thymeleaf, JSP 같은 템플릿 엔진과 함께 사용📌 메서드의 반환값이 View 이름이 됨📌 @ResponseBody 없이 문자열을 반환하면 템플릿을 찾아감🔹

lavenderje.tistory.com

 

 

 

 


 

728x90

'프로그래밍 > Spring' 카테고리의 다른 글

ORM이란?  (0) 2025.04.04
JDBC란?  (0) 2025.04.04
http응답 상태 코드 참조 사이트  (0) 2025.04.03
@Controller와 @RestController의 차이  (0) 2025.04.02
Thymeleaf란?  (0) 2025.04.01