스프링 기본 활용

임선구·2026년 4월 16일

스파르타

목록 보기
15/18
post-thumbnail

베이직 1회차

스프링이란? → IoC 컨테이너

스프링은 IoC 컨테이너 를 제공해주는 프레임워크입니다.
→ 핵심 기능은 IoC 기반의 DI 을 제공하는 ApplicationContext 라는 IoC 컨테이너입니다.


⭐ 개념1 - 스프링컨테이너(IoC 컨테이너)

애플리케이션이 시작될때 스프링컨테이너(IoC 컨테이너) 는 애플리케이션 실행에 필요한 객체를 생성하고 각 객체에 필요한 의존성을 주입합니다. 스프링컨테이너는 이렇게 생성한 객체를 미리 생성해두고 관리하기 때문에 요청이 들어오면 요청처리에 적합한 객체를 활용해 요청을 처리합니다.



⭐ 개념2 - 스프링빈(SpringBean)

IoC 컨테이너에 의해서 생성되고 관리되는 객체를 스프링빈(SpringBean) 이라고 합니다.

⭐ 스프링기술 - 컴포넌트 스캔(Component Scan)

스프링의 자체 기능 - 자바 객체를 스프링 빈으로 등록하는 기술
컴포넌트스캔 을 활용해서 자바 클래스를 스프링 빈 등록 대상으로 지정할 수 있습니다.

다양한 어노테이션 종류들

  • @Component
  • @RestController
  • @Controller
  • @Service
  • @Repository
  • etc

⭐ web 기술 - 요청 연결 매핑(Request Mapping)

  • @RequestMapping() - 보통 클래스 레벨에서 공통 경로 잡을 때 사용
    • @GetMapping() - 조회. 데이터 가져올 때 (목록 조회, 상세 조회)
    • @PostMapping() - 생성. 새 데이터 만들 때 (회원가입, 글 작성)
    • @PatchMapping() - 부분 수정. 기존 데이터 일부만 바꿀 때 (이름만 변경)
    • @DeleteMapping() - 삭제. 데이터 지울 때 (글 삭제, 회원 탈퇴)

⭐ web 기술 - 클라이언트에서 데이터를 받아오는 방법

  1. @RequestBody

    클라이언트가 HTTP 요청 바디로 데이터를 전송할때 사용해야합니다.

POST example.com/schedule
"title": "코딩"
 @PostMapping("/requestbody")
    public String useRequestBody(@RequestBody DataTransferObject dto) {
        System.out.println("message = " + dto.getMessage());
        return "response 문자열";
    }
  1. @PathVariablle

    클라이언트가 URL 경로로 데이터를 전송할 때 사용해야합니다.

GET example.com/schedule/1
@GetMapping("/schedule/{id}")
public String find(@PathVariable Long id) {
    return "조회 ID: " + id;
}
  1. @RequestParm

    클라이언트가 URL 쿼리 파라미터로 데이터를 전송할때 사용해야합니다.

GET example.com/schedule?title=코딩
@GetMapping("/schedule")
public String search(@RequestParam String title) {
    return "검색어: " + title;
}

⭐ JPA 기술 - 데이터베이스를 다루는 방법

a. 엔티티

엔티티는 자바 클래스와 DB 테이블을 연결해주는 개념입니다.

@Entity

b. repository

JpaRepository 를 활용해서 인터페이스를 만들면 스프링이 알아서 ScheduleRepository클래스를 구현해줍니다!

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {}
  • 자동으로 구현된 기능:
    • 전체 조회 - findAll()
    • 단건조회 - findById(…)
    • 저장 - save()
    • 삭제 - delete()

⭐ 3 계층

⭐ 요약

  • 스프링이 관리하는 객체를 스프링 빈이라고 한다.

  • 스프링 빈을 보관하고 관리하는 곳을 Ioc컨테이너라고 한다.

  • @Component, @Service, @Repository 등이 붙은 클래스를 자동으로 찾아서 스프링 빈으로 등록하는 기술을 컴포넌트스캔 이라고 합니다.

  • 클라이언트가 URL 경로에 데이터를 보낼 때 사용하는 어노테이션은 @PathVariable 이다.
    요청예시: GET /schedule/1

  • 클라이언트가 HTTP 요청 바디로 데이터를 보낼 때 사용하는 어노테이션은 @RequestBody 이다.
    요청예시: POST /schedule {"title": "코딩"}

  • 클라이언트가 쿼리 파라미터로 데이터를 보낼 때 사용하는 어노테이션은 @RequestParam 이다.
    요청예시: GET /schedule?title="코딩"

  • 자바 클래스와 DB 테이블을 연결해주는 설계도 역할을 하는 것을 엔티티(entity) 라고 합니다.


베이직 2회차

객체간의 결합도를 통한 3계층 이해(DI, IoC)

의존(Dependency)

객체지향 프로그래밍에서는 객체들이 서로 상호작용합니다. 이 과정에서 한 객체가 다른 객체를 필요하게 되는데 이 관계를 의존(Dependency) 라고 표현합니다.

⭐ 의존성 주입(Dependency Injection)

Car 라는 객체가 필요로 하는 객체(의존객체: Engine) 를 외부에서 생성해서 Car 에 주입해주는 것을 의존성 주입이라고 합니다.

⭐ 객체간의 결합도

객체간의 의존성을 어떻게 설정해주느냐에 따라서 객체간의 결합도가 달라집니다.

1단계 - 직접 의존 + 스스로 생성

필요한 의존 객체를 직접 생성하는 구조

  • 강한 결합
  • 변경에 취약

2단계 - 직접 의존 + 외부에서 생성

의존 객체를 외부에서 생성해서 전달받는 구조

  • 생성 책임이 외부로 분리됨
  • 하지만 여전히 구체적인 클래스에 의존

3단계 - 추상화에 의존

구현체가 아니라 추상화(인터페이스)에 의존하는 구조

  • 구현체 자유롭게 변경 가능
  • 느슨한 결합

⭐ 다형성

하나의 형태(인터페이스/부모클래스)로 여러가지 형태(구현체) 를 다룰 수 있는 성질

⭐ IoC(제어 역전: Inversion of Control)

프로그램 제어흐름을 외부(제 3의 주체) 로 넘기는 설계원칙
→ 스프링에서는 IoC 개념을 컨테이너 형태로 제공해줍니다.

⭐ 스프링의 의존성 주입 방법

  1. 생성자 주입
@Service
public class MemberService {...}
@RestController
public class MemberController {
    private final MemberService memberService;

		@Autowired // 생략 가능
    public UserController(MemberService memberService) {
        this.memberService = memberService;
    }
}

@Autowired생략가능

  1. 필드주입
@Service
public class MemberService {...}
@RestController
public class MemberController {

		@Autowired
    private MemberService memberService;
    
    ...
}
  1. 세터주입
@Service
public class MemberService {...}
@RestController
public class MemberController {
    private MemberController memberService;

		@Autowired
    public void setMemberService(MemberController memberService) {
        this.memberService = memberService;
    }

		...
}

⭐ 정리

⭐ 요약

  • 하나의 데이터타입으로 다양한 구현체를 다룰 수 있는 성질을 다형성 이라고 합니다.

  • 프로그램 제어흐름을 외부로 넘기는 설계 원칙을 제어 역전(IoC: Inversion of Control) 라고 합니다.

  • 구현체가 아닌 인터페이스에 의존하면 Car 코드를 수정하지 않고도 Engine 을 자유롭게 교체할 수 있었습니다. 이를 느슨한 결합 결합이라고 합니다.

  • 객체가 필요로 하는 B객체(의존객체) 를 외부에서 생성해서 주입해주는 것을 의존성주입(DI: dependency Injection) 이라고 합니다.

  • private Engine engine = new ElectricEngine(); 처럼 의존 객체를 직접 생성하면 엔진을 교체하려고 할때 코드를 수정해야합니다. 이를 강한 결합 결합이라고 합니다.

출처: 내일배움스파르타

profile
끝까지 가면 내가 다 이겨

0개의 댓글