"Hello, Spring Boot!" 프로젝트 만들기

juuuu·2025년 4월 5일
0

9oormthon

목록 보기
1/3

MVC 패턴

프로젝트를 구성할 때 Model,Controller,View의 역할로 구분하는 패턴

  • Model: 데이터를 담는 곳 , Controller에서 View로 데이터를 전달하기 위한 일시적인 데이터 저장소
  • Controller: 요청을 처리하는 곳 → 중간 관리자
    사용자의 요청을 받아서 비지니스 로직을 수행하고 그 결과를 View에 전달하는 역할
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public String getUsers(Model model) {
        // 엔티티에서 데이터베이스로부터 사용자 목록을 가져옴
        List<User> users = userService.getAllUsers();

        // 모델에 사용자 데이터를 담아 뷰로 전달
        model.addAttribute("users", users);

        return "userList"; // userList.jsp 혹은 userList.html로 이동
    }
}
  • View: 사용자가 보는 화면, 즉 input text, check box와 같은 사용자 인터페이스 요소를 의미 → 데이터를 기반으로 사용자들이 볼 수 있는 화면

Spring web Layer

  1. Web Layer: 사용자의 요청과 이에 대한 응답 반환의 전반적인 처리가 일어나는 영역
  2. Service Layer: Web Layer와 Repository Layer 사이에서 실질적인 어플리케이션 로직이 일어나는 영역
  3. Repository Layer: DB와 같은 데이터 저장소에 접근하는 영역
  4. DTOs: 계층 간의 데이터 교환을 위한 객체
  5. Domain Model: 개발 대상, 즉 도메인을 모든 사람들이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화한 것

  • DAO (Data Access Object) : 데이터 베이스에 접근하기 위한 객체
  • DTO (Data Transfer Object): 계층 간 데이터 교환을 하기 위해 사용하는 객체 → 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)
  • VO (Value Object): 값 오브젝트로써 값을 위해 쓰임 오직 read-Only
    VO는 DTO와 다르게 getter만 가지고 있음
  • IOC(Inversion of Control,제어의 역전): 제어의 흐름을 개발자가 직접 관리하지 않고 프레임워크나 컨테이너가 대신 관리하는 것
    → 의존하는 객체를 직접 생성하지 않으므로 클래스 간 의존성이 낮아짐
  • DI(Dependency Injection,의존성 주입): 객체가 다른 객체에 의존할 때 이를 외부에서 주입해주는 방식

DI 방식

  • 생성자 주입 (Constructor Injection)
    • 객체를 생성할 때 의존성을 생성자의 인자로 주입하는 방식
public class Car {
    private Engine engine;

    // 생성자를 통해 의존성을 주입
    public Car(Engine engine) {
        this.engine = engine;
    }
}
  • setter 주입 (Setter Injection)
    • 객체 생성 후 세터 메서드를 통해 의존성을 주입
    • 선택적인 의존성에 대해 사용할 수 있으며 의존성이 필요하지 않을 수도 있는 경우에 유용
public class Car {
    private Engine engine;

    // 세터를 통해 의존성 주입
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}
  • 필드 주입 (Field Injection)
    • 필드에 직접적으로 의존성을 주입하는 방식으로 가장 간단한 방법
    • 테스트나 유지보수 측면에서 권장되지 않음
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

Spring Bean

Bean의 역할

  • 객체 생성 및 관리
  • 의존성 관리
  • 객체 생애 주기 관리

Bean 등록하는 방법

  • 어노테이션 기반 설정
    • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록
    • @Component를 포함하는 @Controller, @Service, @Repository 애노테이션도 스프링 빈으로 자동 등록
  • 자바 설정 파일
    • @Configuration@Bean 애노테이션을 이용해 스프링 빈을 등록
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

스프링 컨테이너(Spring Container)

  • 빈의 생명주기를 관리(빈의 생성, 관리,제거)하며 생성된 빈에게 추가적인 기능을 제공하는 것
  • DI(의존성 주입)을 통해 애플리케이션의 컴포넌트를 관리
  • 스프링 컨테이너는 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 함
  • 객체 간의 의존성을 낮추어 결합도를 낮추고 높은 캡슐화를 위해 스프링 컨테이너를 사용

스프링 컨테이너의 종류

  • Bean Factory
    • 스프링 컨테이너의 최상위 인터페이스
    • 가장 기본적인 스프링 컨테이너로 설정된 빈을 관리하고 의존성을 주입함
    • 주로 리소스가 제한적인 상황에서 사용됨
  • Application Context
    - BeanFactory를 확장한 컨테이너로 대부분의 스프링 애플리케이션에서 사용함

계층형 디렉터리 구조

  • src/main/java: 자바 소스 코드를 저장하는 디렉터리
    컨트롤러,서비스,리포지토리, 도메일 모델 등의 자바 클래스 파일들이 저장됨
  • src/main/resources: 애플리케이션 설정 파일, 정적 리소스, 템플릿 등을 저장하는 디렉터리
  • src/test/java: 테스트용 자바 소스 코드를 저장하는 디렉터리
  • src/test/resources: 테스트에 필요한 리소스 파일을 저장하는 디렉터리

간단한 API 개발

  • /hello 요청이 들어오면 "Hello,World!"문자열을 반환하는 API 만들기

0개의 댓글