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


IoC 컨테이너에 의해서 생성되고 관리되는 객체를 스프링빈(SpringBean) 이라고 합니다.
스프링의 자체 기능 - 자바 객체를 스프링 빈으로 등록하는 기술
컴포넌트스캔 을 활용해서 자바 클래스를 스프링 빈 등록 대상으로 지정할 수 있습니다.
다양한 어노테이션 종류들
@Component@RestController@Controller@Service@Repository
@RequestMapping() - 보통 클래스 레벨에서 공통 경로 잡을 때 사용@GetMapping() - 조회. 데이터 가져올 때 (목록 조회, 상세 조회)@PostMapping() - 생성. 새 데이터 만들 때 (회원가입, 글 작성)@PatchMapping() - 부분 수정. 기존 데이터 일부만 바꿀 때 (이름만 변경)@DeleteMapping() - 삭제. 데이터 지울 때 (글 삭제, 회원 탈퇴)
클라이언트가 HTTP 요청 바디로 데이터를 전송할때 사용해야합니다.
POST example.com/schedule
"title": "코딩"
@PostMapping("/requestbody")
public String useRequestBody(@RequestBody DataTransferObject dto) {
System.out.println("message = " + dto.getMessage());
return "response 문자열";
}
클라이언트가 URL 경로로 데이터를 전송할 때 사용해야합니다.
GET example.com/schedule/1
@GetMapping("/schedule/{id}")
public String find(@PathVariable Long id) {
return "조회 ID: " + id;
}
클라이언트가 URL 쿼리 파라미터로 데이터를 전송할때 사용해야합니다.
GET example.com/schedule?title=코딩
@GetMapping("/schedule")
public String search(@RequestParam String title) {
return "검색어: " + title;
}
a. 엔티티
엔티티는 자바 클래스와 DB 테이블을 연결해주는 개념입니다.
@Entity
b. repository
JpaRepository를 활용해서 인터페이스를 만들면 스프링이 알아서ScheduleRepository클래스를 구현해줍니다!
public interface ScheduleRepository extends JpaRepository<Schedule, Long> {}
findAll()findById(…)save()delete()
스프링이 관리하는 객체를 스프링 빈이라고 한다.
스프링 빈을 보관하고 관리하는 곳을 Ioc컨테이너라고 한다.
@Component, @Service, @Repository 등이 붙은 클래스를 자동으로 찾아서 스프링 빈으로 등록하는 기술을 컴포넌트스캔 이라고 합니다.
클라이언트가 URL 경로에 데이터를 보낼 때 사용하는 어노테이션은 @PathVariable 이다.
요청예시: GET /schedule/1
클라이언트가 HTTP 요청 바디로 데이터를 보낼 때 사용하는 어노테이션은 @RequestBody 이다.
요청예시: POST /schedule {"title": "코딩"}
클라이언트가 쿼리 파라미터로 데이터를 보낼 때 사용하는 어노테이션은 @RequestParam 이다.
요청예시: GET /schedule?title="코딩"
자바 클래스와 DB 테이블을 연결해주는 설계도 역할을 하는 것을 엔티티(entity) 라고 합니다.
객체지향 프로그래밍에서는 객체들이 서로 상호작용합니다. 이 과정에서 한 객체가 다른 객체를 필요하게 되는데 이 관계를 의존(Dependency) 라고 표현합니다.
Car 라는 객체가 필요로 하는 객체(의존객체: Engine) 를 외부에서 생성해서 Car 에 주입해주는 것을 의존성 주입이라고 합니다.
객체간의 의존성을 어떻게 설정해주느냐에 따라서 객체간의 결합도가 달라집니다.
필요한 의존 객체를 직접 생성하는 구조
- 강한 결합
- 변경에 취약
의존 객체를 외부에서 생성해서 전달받는 구조
- 생성 책임이 외부로 분리됨
- 하지만 여전히 구체적인 클래스에 의존
구현체가 아니라 추상화(인터페이스)에 의존하는 구조
- 구현체 자유롭게 변경 가능
- 느슨한 결합
하나의 형태(인터페이스/부모클래스)로 여러가지 형태(구현체) 를 다룰 수 있는 성질
프로그램 제어흐름을 외부(제 3의 주체) 로 넘기는 설계원칙
→ 스프링에서는 IoC 개념을 컨테이너 형태로 제공해줍니다.
@Service
public class MemberService {...}
@RestController
public class MemberController {
private final MemberService memberService;
@Autowired // 생략 가능
public UserController(MemberService memberService) {
this.memberService = memberService;
}
}
@Autowired생략가능
@Service
public class MemberService {...}
@RestController
public class MemberController {
@Autowired
private MemberService memberService;
...
}
@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(); 처럼 의존 객체를 직접 생성하면 엔진을 교체하려고 할때 코드를 수정해야합니다. 이를 강한 결합 결합이라고 합니다.
출처: 내일배움스파르타