spring 구조 이해하기

개발 오답 노트·2025년 6월 24일

개념정리

목록 보기
11/13

자바(Spring Framework 기반)에서의 Controller, Service, DAO 구조는 계층형 아키텍처 (Layered Architecture) 를 따르는 전형적인 설계입니다. 각 계층은 역할이 분리되어 유지보수성과 재사용성이 높습니다.

🧭 전체 흐름 설명

1. Controller (컨트롤러)

  • 클라이언트 요청을 받아 처리하고, 응답을 반환

  • Service 계층을 호출

2. Service (서비스 인터페이스)

  • 비즈니스 로직을 정의 (인터페이스만 정의)

  • 실제 로직은 ServiceImpl에서 구현

3. ServiceImpl (서비스 구현체)

  • Service 인터페이스를 구현

  • DAO 계층을 호출하여 데이터베이스 작업 수행

4. DAO (데이터 접근 인터페이스)

  • DB 접근 메서드 정의

5. DAOImpl (DAO 구현체)

  • 실제 DB 연산을 수행 (JDBC, JPA 등으로 구현)

📁 디렉토리 구조 예시

com.example.demo
├── controller
│ └── UserController.java
├── service
│ ├── UserService.java
│ └── UserServiceImpl.java
├── dao
│ ├── UserDAO.java
│ └── UserDAOImpl.java
└── model
└── User.java

💻 예제: 사용자 이름 조회 (UserController → UserService → UserDAO)

📌 1. User.java (모델)

public class User {
    private int id;
    private String name;

    // 생성자, getter, setter
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public int getId() { return id; }
    public String getName() { return name; }
}

📌 2. UserDAO.java (DAO 인터페이스)

public interface UserDAO {
    User findUserById(int id);
}

📌 3. UserDAOImpl.java (DAO 구현체)

import java.util.HashMap;
import java.util.Map;

public class UserDAOImpl implements UserDAO {
    private static final Map<Integer, User> userDb = new HashMap<>();

    static {
        userDb.put(1, new User(1, "Alice"));
        userDb.put(2, new User(2, "Bob"));
    }

    @Override
    public User findUserById(int id) {
        return userDb.get(id);
    }
}

📌 4. UserService.java (서비스 인터페이스)

public interface UserService {
    String getUserNameById(int id);
}

📌 5. UserServiceImpl.java (서비스 구현체)

public class UserServiceImpl implements UserService {
    private final UserDAO userDAO = new UserDAOImpl();

    @Override
    public String getUserNameById(int id) {
        User user = userDAO.findUserById(id);
        return user != null ? user.getName() : "사용자 없음";
    }
}

📌 6. UserController.java (컨트롤러)

import java.util.Scanner;

public class UserController {
    private final UserService userService = new UserServiceImpl();

    public void getUserName() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("사용자 ID를 입력하세요: ");
        int id = scanner.nextInt();

        String name = userService.getUserNameById(id);
        System.out.println("사용자 이름: " + name);
    }

    public static void main(String[] args) {
        UserController controller = new UserController();
        controller.getUserName();
    }
}

✅ 실행 결과 예시

사용자 ID를 입력하세요: 1
사용자 이름: Alice

🧩 요약

계층클래스역할
ControllerUserController클라이언트 요청 처리
ServiceUserService, UserServiceImpl비즈니스 로직 처리
DAOUserDAO, UserDAOImplDB 접근 로직 처리
ModelUser데이터 객체

이 구조는 Spring Framework에서도 동일하게 사용되며, 각 계층은 @Controller, @Service, @Repository 등의 애너테이션으로 정의됩니다.

profile
포토폴리오 https://wikidocs.net/book/10969 유튜브 링크 https://www.youtube.com/@%EC%B5%9C%EC%9B%90%EC%9D%BC-n5r

0개의 댓글