Controller
Controller는 사용자의 요청을 받아 처리하는 계층입니다. 스프링 MVC 패턴에서 Controller는 HTTP 요청을 받아들이고, 요청에 따라 필요한 서비스 로직을 호출하여 결과를 반환합니다. 이 결과는 보통 뷰 템플릿을 통해 렌더링되거나 JSON, XML 같은 형태로 클라이언트에 직접 반환됩니다.
예를 들어, UserController는 사용자 관련 요청을 처리하며, 사용자 생성, 조회, 수정, 삭제와 같은 작업을 담당합니다.
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return new ResponseEntity<>(userService.createUser(user), HttpStatus.CREATED);
}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
// Update and Delete method 도 이와 비슷
}
Domain
Domain은 비즈니스 로직의 핵심 개념과 규칙을 담고 있는 계층입니다. 여기서는 사용자, 상품, 주문 등과 같은 비즈니스 도메인 객체들을 정의합니다. 이들 객체는 데이터베이스 테이블과 매핑되어 데이터를 표현합니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
Repository
Repository는 도메인 객체를 데이터베이스에 영구적으로 저장하고 검색하는 메커니즘을 제공합니다. 스프링 데이터 JPA를 사용하면 인터페이스를 정의함으로써 실제 구현체 없이도 JPA가 자동으로 구현체를 생성해 줍니다.
public interface UserRepository extends JpaRepository<User, Long> {
// CRUD 메서드들은 JpaRepository에 이미 정의되어 있으므로 추가적인 메서드 정의는 필요에 따라 진행
}
Service
Service 계층은 비즈니스 로직을 구현하는 곳입니다. 이 계층은 Controller와 Repository 사이에서 도메인 객체에 대한 비즈니스 로직을 처리합니다. 예를 들어, 사용자를 생성하는 로직, 사용자 정보를 업데이트하는 로직 등이 Service 계층에서 구현됩니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User createUser(User user) {
// 유효성 검사, 비즈니스 로직 처리 등
return userRepository.save(user);
}
public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
// Update and Delete services follow similar structure
}
CRUD 로직의 흐름
- Create (생성): 사용자는 Controller를 통해 생성 요청을 보냅니다. Controller는 Service 계층의 createUser 메서드를 호출하고, Service 계층은 비즈니스 로직을 처리한 후 Repository를 통해 객체를 데이터베이스에 저장합니다.
- Read (읽기): 사용자는 특정 ID로 조회 요청을 보냅니다. Controller는 Service 계층의 getUserById 메서드를 호출하고, Service 계층은 Repository를 통해 해당 ID의 객체를 데이터베이스에서 가져옵니다.
- Update (업데이트): 사용자는 업데이트 요청과 함께 수정할 데이터를 보냅니다. Controller는 이 요청을 받아 Service 계층의 업데이트 메서드를 호출하고, Service 계층은 새로운 데이터로 객체를 업데이트한 후 Repository를 통해 데이터베이스에 반영합니다.
- Delete (삭제): 사용자는 삭제할 객체의 ID와 함께 삭제 요청을 보냅니다. Controller는 이 요청을 받아 Service 계층의 삭제 메서드를 호출하고, Service 계층은 Repository를 통해 해당 객체를 데이터베이스에서 삭제합니다.