본문 바로가기

SpringBoot from Laravel

Spring Boot에서 API 개발 최적화: Laravel API → Spring Boot REST API

반응형

1. 서론

 

Laravel과 Spring Boot는 모두 강력한 백엔드 프레임워크로, REST API 개발을 지원합니다.

하지만 API 개발 방식, 데이터 반환 구조, 요청 처리 방식에서 차이가 있습니다.

 

이번 글에서는 Laravel에서 개발한 REST API를 Spring Boot로 최적화하여 변환하는 방법을 다룹니다.

 

Laravel의 API 개발 방식 vs Spring Boot REST API 비교

Spring Boot에서 DTO(Data Transfer Object) 패턴 적용

API 요청/응답 구조 최적화

에러 처리 및 공통 응답 구조 설정

2. Laravel과 Spring Boot의 API 개발 방식 비교

비교 항목Laravel (PHP)Spring Boot (Java)

라우팅 방식 routes/api.php @RestController + @RequestMapping
JSON 응답 방식 response()->json([...]) ResponseEntity<>
데이터 검증 Form Request + validate() @Valid + DTO
에러 핸들링 try-catch + abort() @ExceptionHandler

변환 전략

Laravel의 routes/api.php → Spring Boot의 @RequestMapping

Laravel의 response()->json([...])ResponseEntity<>

데이터 검증 방식 변경 (Form Request → DTO 패턴 적용)

3. 기본 REST API 변환 (GET 요청 - 데이터 조회)

 

🔹 Laravel의 API 라우팅 및 컨트롤러 (GET 요청)

// routes/api.php
Route::get('/users', [UserController::class, 'index']);
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use App\Models\User;

class UserController extends Controller {
    public function index() {
        return response()->json(User::all(), 200);
    }
}

🔹 Spring Boot의 GET API 변환 (@GetMapping)

// UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(userService.getAllUsers());
    }
}

변환 전략

Route::get('/users', ...)@GetMapping("/api/users")

response()->json(User::all(), 200)ResponseEntity.ok(userService.getAllUsers())

Laravel의 User::all() → Spring Boot의 Service & Repository 패턴 적용

4. 데이터 검증 (Laravel Form Request → Spring Boot DTO)

 

🔹 Laravel의 데이터 검증 (Form Request)

class StoreUserRequest extends FormRequest {
    public function rules(): array {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6'
        ];
    }
}

Spring Boot에서는 DTO를 활용하여 요청 데이터를 검증합니다.

 

🔹 Spring Boot의 DTO 변환 (@Valid + DTO 패턴)

import jakarta.validation.constraints.*;

public class UserRequestDTO {
    @NotBlank
    @Size(max = 255)
    private String name;

    @NotBlank
    @Email
    private String email;

    @NotBlank
    @Size(min = 6)
    private String password;
}

변환 전략

Laravel의 FormRequest → Spring Boot의 DTO 패턴

Laravel의 'required|string|max:255'@NotBlank @Size(max = 255)

Laravel의 'required|email|unique:users'@Email

5. 데이터 저장 (POST 요청 - 사용자 등록)

 

🔹 Laravel의 POST API

Route::post('/users', [UserController::class, 'store']);
public function store(StoreUserRequest $request) {
    $user = User::create($request->validated());
    return response()->json($user, 201);
}

🔹 Spring Boot의 POST API (@PostMapping)

@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody UserRequestDTO userRequest) {
    User savedUser = userService.saveUser(userRequest);
    return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}

변환 전략

Laravel의 Route::post('/users', ...)@PostMapping

Laravel의 response()->json($user, 201)ResponseEntity.status(HttpStatus.CREATED).body(savedUser)

FormRequest 기반 검증을 @Valid @RequestBody DTO로 변환

6. 데이터 수정 (PUT 요청 - 사용자 정보 수정)

 

🔹 Laravel의 PUT API

Route::put('/users/{id}', [UserController::class, 'update']);
public function update(Request $request, $id) {
    $user = User::findOrFail($id);
    $user->update($request->all());
    return response()->json($user);
}

🔹 Spring Boot의 PUT API (@PutMapping)

@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @Valid @RequestBody UserRequestDTO userRequest) {
    User updatedUser = userService.updateUser(id, userRequest);
    return ResponseEntity.ok(updatedUser);
}

변환 전략

Laravel의 Route::put('/users/{id}', ...)@PutMapping("/{id}")

$user->update($request->all())userService.updateUser(id, userRequest)

7. 공통 응답 형식 적용 (Laravel API Resource → Spring Boot Response DTO)

 

Laravel에서는 API Resource를 사용하여 응답 형식을 일관되게 유지합니다.

 

🔹 Laravel의 API 응답 형식 (API Resource)

class UserResource extends JsonResource {
    public function toArray($request) {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ];
    }
}

Spring Boot에서는 Response DTO를 사용하여 일관된 응답 구조를 유지합니다.

 

🔹 Spring Boot의 Response DTO 적용

public class UserResponseDTO {
    private Long id;
    private String name;
    private String email;

    public UserResponseDTO(User user) {
        this.id = user.getId();
        this.name = user.getName();
        this.email = user.getEmail();
    }
}

변환 전략

Laravel의 API Resource → Spring Boot의 Response DTO 적용

모든 API에서 공통된 응답 구조 유지 가능

8. 에러 처리 (Laravel Exception → Spring Boot @ExceptionHandler)

 

🔹 Laravel의 예외 처리 (try-catch + abort())

public function show($id) {
    $user = User::find($id);
    if (!$user) {
        abort(404, 'User not found');
    }
    return response()->json($user);
}

🔹 Spring Boot의 예외 처리 (@ExceptionHandler)

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}

변환 전략

Laravel의 abort(404, 'User not found') → Spring Boot의 @ExceptionHandler

9. 결론

 

✅ Laravel API를 Spring Boot REST API로 변환하는 방법 정리

✅ API 요청/응답 최적화 (DTO 패턴 적용)

✅ 데이터 검증 & 에러 처리 방식 변경

다음 글에서는 “Spring Boot 성능 최적화: Laravel 대비 성능 향상 방법”을 다룰 예정!

 

반응형