-> 웹서버
-> 정적파일 (HTML, CSS, JAVASCRIPT)
-> 정적 리소스 (저장된 이미지, 동영상 등)
-> 웹 애플리케이션 서버
-> 동적 파일(JSP, Servlet 등 )
자바객체 : 대상을 추상화 한 자바 코드 (시스템에서 0101 이진데이터로 변환)
JSON : 대상을 추상화 한 문자열 데이터
-> 개별 바이트나 문자열인 데이터의 원천
-> 데이터가 전송되는 통로
-> 키보드, 파일, 네트워크 등등
-> 객체를 데이터 스트림(문자열)으로 만드는 것
-> 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것
-> 스트림을 객체로 만드는 것
-> 다른 기족간의 데이터 송수신을 위해 필요하다.
-> java객체 -> 직렬화 -> json -> 역직렬화 -> python객체로 변환
-> 다른 언어에서도 사용
라이브러리 : 개발자가 제어하기 때문에 유연성과 자유도가 높음
프레임워크 : 프레임워크가 제어하기 때문에 개발자의 유연성과 자유도가 낮음
1) 협업 : 구조가 같아 협업이 쉬움
2) 안정성 : 확인해야할 사항들을 프레임워크가 체크함
3) 보안 : 웹 관련 공격을 막을 방법을 미리 세팅해 놓음
4) 신입 : 가이드가 없으면 신입은 코드를 짜기가 어려움
-> Spring IoC 컨테이너가 관리하는 자바 객체
-> 생성방법만 명시하면 스프링이 알아서 객체를 생성하고 유지하고 소멸시킨다.
<출력>
-> @Bean, @Component에 어노테이션을 붙이면 Spring IoC 컨테이너가 장동으로 해당 객체를 생성해준다.
-> 해당객체를 필요로 하는 다른 객체에 주입 시켜준다 DI
-> 우리는 단 한번도 new 생성자를 써서 객체를 만들지 않았다 = 제어의 역전(IoC - 프레임워크가 컨트롤한다.)
-> 여러번 생성할 필요가 없는 객체는 스프링이 싱클돈처럼 관리한다.
메타 어노테이션 : 어노테이션에 붙을 수 있는 어노테이션
합성 어노테이션 : 어노테이션을 여러개 붙인것
@Bean 와 @Component 를 주로 사용하게 됨.
@ComponentScan 어노테이션이 붙은 패기지는 하위의 모든 @Bean과 @Component를 스캔하여 객체를 생성
@Autowired - 타입으로 주입 (없으면 이름으로) = 생성자 생성과 같은 효과, setter/생성자/필드에 붙힐수 있다.
private -> 객체가 생성되고나서 setter로 수정이 가능
private final -> 객체가 생상되고나서 변경 불가능 : 스프링이 강제로 주입하라고 시키는 것.
-> Spring IOC 컨테이너가 관리
-> ComponentScan으로 Bean/Component를 찾아서 객체를 생성
-> 생성한 객체를 필요한 곳에 알아서 넣어준다 (DI)
커피숍
new -> 클라이언트가 요청시마다 new를 하면 비용적으로 매우 손실이 크다
@Component
@ComponentScan으로 미리 모두 다 준비해놓고, 필요하면 준비된 객체를 제공 한다
스프링 IOC 컨테이너가 관리
ComponentScan으로 Bean/Component를 찾아서 객체를 생성
생성한 객체를 필요한 곳에 알아서 넣어준다 DI
@Bean
@Component
어노테이션을 붙이면
Spring IoC 컨테이너가 자동으로 해당 객체를 생성한다
해당 객체를 필요로 하는 다른 객체에 주입 시켜준다 DI
우리는 단 한번도 new(생성자)를 써서 객체를 만들지 않았다 = 제어의 역전 (IoC) - 프레임워크가 컨트롤한다
여러번 생성할 필요가 없는 객체는 스프링이 싱글톤처럼 관리한다
<커피숍 생성 예제>
<Coffee.java>
package com.example.grazie;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
// 커피이름을 받는 생성자 생성 = @AllArgsConstructor
@AllArgsConstructor
public class Coffee {
private String name;
}
<CoffeeService.java>
package com.example.grazie;
import org.springframework.stereotype.Service;
@Service
// 커피 말아주는 직원 -> 아메리카노, 카푸치노, 아샷추만 만들수 있음
public class CoffeeService {
public Coffee 아메리카노(){
return new Coffee("아메리카노");
}
public Coffee 카푸치노(){
return new Coffee("카푸치노");
}
public Coffee 아샷추(){
return new Coffee("아샷추");
}
}
<CoffeeController.java>
package com.example.grazie;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//카운터직원
@RestController
@RequiredArgsConstructor
public class CoffeeCotroller {
private final CoffeeService coffeeService;
// @RequiredArgsConstructor 와 밑의 생성자 만드는것과 동일
// public CoffeeCotroller(CoffeeService coffeeService) {
// this.coffeeService = coffeeService;
// }
// @GetMapping("/아메리카노") = 고객이 요청하는 내용
@GetMapping("/아메리카노")
public Coffee 아메리카노(){
return coffeeService.아메리카노();
}
@GetMapping("/카푸치노")
public Coffee 카푸치노(){
return coffeeService.카푸치노();
}
@GetMapping("/아샷추")
public Coffee 아샷추(){
return coffeeService.아샷추();
}
}