BACKEND/SPRING

데이터베이스 연동 - 레포지토리 인터페이스 설계와 DAO 연동을 위한 컨트롤러 설계

우진하다 2023. 8. 6. 23:14

데이터베이스 연동에 있어 레포지토리 인터페이스와 컨트롤러의 설계는 중요한 부분입니다. 레포지토리는 DAO와 유사하게 데이터 액세스 로직을 추상화하고, 컨트롤러는 사용자 요청을 처리하여 서비스 레이어와 레포지토리와의 연동을 담당합니다.

레포지토리 인터페이스 설계

레포지토리 인터페이스는 Spring Data JPA를 사용하여 엔터티와 관련된 CRUD 작업을 단순화하게 해줍니다. 인터페이스만 정의하면 Spring Data JPA가 런타임에 구현체를 자동으로 생성합니다.

public interface PersonRepository extends JpaRepository<Person, Long> {
    // 추가적인 쿼리 메서드를 정의할 수 있습니다.
    List<Person> findByName(String name);
}

 

컨트롤러 설계

컨트롤러는 HTTP 요청을 받아 처리하고 응답을 반환하는 역할을 합니다. 
서비스 레이어와 레포지토리와의 연동을 통해 비즈니스 로직을 수행하고 결과를 반환합니다.

@RestController
@RequestMapping("/api/persons")
public class PersonController {
    @Autowired
    private PersonRepository personRepository;

    @GetMapping
    public List<Person> getAllPersons() {
        return personRepository.findAll();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Person> getPersonById(@PathVariable Long id) {
        Optional<Person> person = personRepository.findById(id);
        return person.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
    }

    @PostMapping
    public Person createPerson(@RequestBody Person person) {
        return personRepository.save(person);
    }

    @PutMapping("/{id}")
    public Person updatePerson(@PathVariable Long id, @RequestBody Person updatedPerson) {
        return personRepository.findById(id)
                .map(person -> {
                    person.setName(updatedPerson.getName());
                    person.setAge(updatedPerson.getAge());
                    return personRepository.save(person);
                })
                .orElseThrow(() -> new ResourceNotFoundException("Person not found with id " + id));
    }

    @DeleteMapping("/{id}")
    public void deletePerson(@PathVariable Long id) {
        personRepository.deleteById(id);
    }
}

 

정리

레포지토리 인터페이스 설계:
Spring Data JPA를 사용하면 레포지토리 인터페이스만으로 CRUD 작업을 쉽게 수행할 수 있습니다.

컨트롤러 설계: 
컨트롤러는 사용자의 HTTP 요청을 처리하고 레포지토리 또는 서비스와 연동하여 비즈니스 로직을 수행하고 결과를 반환합니다.

이러한 설계를 통해 데이터베이스 연동을 간결하고 유연하게 만들 수 있으며, 코드의 재사용과 유지보수가 용이합니다. Spring Framework와 Spring Data JPA를 사용하면 개발 생산성을 크게 향상시킬 수 있습니다.

 

스프링부트 웹 애플리케이션 흐름

스프링부트 웹 애플리케이션 흐름

사용자 요청: 
사용자가 웹 브라우저나 클라이언트 애플리케이션을 통해 특정 URL로 요청을 보냅니다.

Dispatcher Servlet: 
스프링 MVC의 핵심 컴포넌트인 Dispatcher Servlet이 요청을 받아 처리합니다. 
Dispatcher Servlet은 해당 요청을 처리할 수 있는 적절한 컨트롤러를 찾습니다.

컨트롤러 매핑: 
요청 URL은 특정 컨트롤러의 메서드와 매핑됩니다. 
해당 컨트롤러는 비즈니스 로직을 수행하기 위해 서비스 레이어에게 처리를 위임할 수 있습니다.

서비스 레이어: 
컨트롤러가 호출한 서비스는 비즈니스 로직을 수행하고, 
필요한 경우 데이터베이스와 상호작용하기 위해 레포지토리를 사용할 수 있습니다.

데이터베이스 상호작용: 
레포지토리 레이어는 JPA, Hibernate 등의 ORM 도구를 사용하여 데이터베이스와 상호작용합니다.

뷰 렌더링: 컨트롤러는 처리 결과를 바탕으로 응답을 구성합니다. HTML을 반환하는 경우, 뷰 리졸버가 특정 템플릿 엔진(예: Thymeleaf, JSP 등)을 사용하여 뷰를 렌더링할 수 있습니다.

응답 반환: 최종적으로 생성된 뷰 또는 데이터는 클라이언트에게 응답으로 전송됩니다.