포스트맨 설치
• 별도의 애플리케이션
• HTTP 요청을 보낼 수 있는 클라이언트 프로그램
• API 개발을 마친 후 웹 브라우저에서 테스트하기 보다, 포스트맨을 이용하기
. 다운로드
① 구글에서 포스트맨 검색 - 다운로드 : Mac Apple Chip 클릭 - 파인더에서 다운로드 받은 파일 클릭해서 실행시키면 설치 완료!
② 하단 Skip and go to the app 클릭 : 계정없이 사용해보기
③ 프로젝트 실행시킨 후, 포스트맨에서 호출해보기
1. 스프링과 스프링 부트
1) 스프링의 등장
- 엔터프라이즈 애플리케이션 ( Enterprise Application )
▪︎ 대규모의 복잡한 데이터를 관리하는 애플리케이션 용어
▪︎ 소프트웨어의 발전으로 엔터프라이즈 애플리케이션이 점점 복잡해짐
→ ( 예시 )
은행 시스템 : 굉장히 많은 사람들이 한꺼번에 잔고 조회, 입금 및 출금 요청, 새 계좌 개설 진행
⇒ 많은 사용자의 요청을 동시에 처리
∴ 서버 성능과 안정성, 보안이 매우 중요!
사실상 이런 것들을 신경쓰면서 사이트 기능 즉, 비즈니스 로직까지 개발하기는 매우 어려운 상황
- 이런 상황에서 '스프링 프레임워크'가 등장
▪︎ 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구
→ 덕분에 개발자들은 기능 개발에 집중할 수 있게 됨
2) 스프링을 더 쉽게 만들어주는 스프링 부트
- '스프링'의 경우, 장점이 많은 개발도구이지만 설정이 매우 복잡하다는 단점이 있음
- 이런 단점을 인식하고 보완하고자 '스프링 부트'를 출시함
▪︎ '스프링 부트'
• 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구
• 빠르게 스프링 프로젝트 설정 가능
• 의존성 세트라고 불리는 스타터를 사용해 간편하게 의존성을 사용하거나 관리 가능
▪︎ '스프링 부트' 의 주요 특징
① 톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버 (Web Application Server, WAS )가 내장 → 따로 설치하지 않아도 독립적으로 실행 가능
② 빌드 구성을 단순화하는 스프링 부트 스타터 제공
③ XML 설정을 하지 않고 자바 코드로 모두 작성 가능
④ JAR를 이용해서 자바 옵션만으로도 배포 가능
⑤ 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터 (spring actuator)를 제공
◉ 참고!
스프링 부트와 스프링은 다른 도구가 아니다!
스프링 부트는 스프링에 속한 도구! 단, 개발할 때 몇 가지의 차이점 존재
차이점에 대해 알아보자
❶ 구성의 차이
- 스프링 : 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야 함
- 스프링 부트 : 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드 → 수동으로 개발환경을 구성할 필요 없음
❷ 내장 WAS의 유무
- 스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포됨
- WAS란?
• 웹 애플리케이션을 실행하기 위한 장치
- 스프링 부트의 경우, WAS를 자체적으로 가지고 있음
→ JAR 파일만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션 실행 가능
▪︎ 스프링과 스프링 부트의 특징 비교
스프링 | 스프링 부트 | |
목적 | 엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 | 스프링의 개발을 더 빠르고 쉽게 하기 |
설정파일 | 개발자가 수동으로 구성 | 자동 구성 |
XML | 일부 파일은 XML로 직접 생성하고 관리 | 사용하지 않음 |
인메모리 데이터베이스 지원 | 지원하지 않음 | 인메모리 데이터베이스 자동 설정 지원 |
서버 | 프로젝트를 띄우는 서버( 톰캣, 제티)를 별도로 수동 설정 |
내장형 서버를 제공해 별도의 설정이 필요 없음 |
2. 스프링 콘셉트 공부하기
1) 제어의 역전과 의존성 주입
◉ IoC ( Inversion of Control, 제어의 역전 )
▪︎ 자바의 경우,
객체를 생성할 때 객체가 필요한 곳에서 직접 생성 ( 순방향 )
// * 클래스 A에서 클래스 B 객체 생성의 예
public class A {
b = new B(); // 클래스 A에서 new 키워드로 클래스 B의 객체 생성.
}
▪︎ 스프링의 경우,
다른 객체를 직접 생성하거나 제어하는 것이 아니라, 외부에서 관리하는 객체를 가져와 사용 ( 역방향 )
- 스프링 컨테이너가 객체를 관리 및 제공하는 역할을 수행
// * 스프링 컨테이너가 객체를 관리하는 방식의 예
public class A {
private B b; // 코드에서 객체를 생성하지 않음. 어디선가 받아온 객체를 b에 할당.
}
◉ DI ( Dependence Injection, 의존성 주입 )
▪︎ 스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용
▪︎ 제어의 역전을 구현하기 위해 사용하는 방법이 DI, 의존성 주입!
▪︎ DI : 어떤 클래스가 다른 클래스에 의존한다는 뜻
▪︎ 다음은 IoC / DI를 기초로 하는 스프링 코드
// * 객체를 주입받는 모습의 예
public class A {
// A에서 B를 주입받음
@Autowired
B b;
}
- @Autowired
• 스프링 컨테이너에 있는 빈을 주입하는 역할
( 빈 : 스프링 컨테이너에서 관리하는 객체 )
- 위의 코드를 살펴 보면,
B b; 라고 선언했을 뿐 직접 객체를 생성하지는 않고 있음
즉, 스프링 컨테이너에서 객체를 주입받고 있음
( = 스프링 컨테이너가 B 객체를 만들어서 클래스 A에 준 것 )
2) 빈과 스프링 컨테이너
◉ 스프링 컨테이너
▪︎ 스프링은 스프링 컨테이너 제공 → 스프링 컨테이너에서 빈을 생성하고 관리
▪︎ 즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리!
▪︎ 또한, 개발자가 '@Autowired' 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원함
◉ 빈
▪︎ 스프링 컨테이너가 생성하고 관리하는 객체
▪︎ 스프링의 경우, 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공함
⇒ 즉, 빈을 등록하는 방법은 다양하다!
▪︎ ( 예시 ) 클래스를 빈으로 등록
@Component // 클래스 MyBean를 빈으로 등록
public class MyBean {
}
- @Component
• 클래스를 빈으로 등록하는 역할
• 빈으로 등록되면, 스프링 컨테이너가 이 클래스를 관리함
→ 이때 빈의 이름은 클래스의 이름의 첫글자를 소문자로 바꿔 관리 : myBean
3) 관점 지향 프로그래밍
◉ AOP ( Aspect Oriented Programming, 관점 지향 프로그래밍 )
▪︎ 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미
▪︎ ( 예시 )
계좌 이체, 고객 관리하는 프로그램
- 각 프로그램에는 아래의 로직이 포함됨
• 로깅 로직 : 지금까지 벌어진 일을 기록하기 위한 로직
• 연결 로직 : 여러 데이터를 관리하기 위한 데이터베이스 연결 로직
- 이때,
핵심 관점 : 계좌 이체, 고객 관리 로직
부가 관점 : 로깅, 데이터베이스 연결 로직
즉, 로깅과 데이터베이스 연결 로직은 계좌 이체와 고객 관리에 모두 필요
- AOP 관점을 적용하면, 부가 관점에 해당하는 로직을 모듈화해 개발
즉, 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있게 해줌
⇒ 개발자는 핵심 관점 코드에만 집중 가능 & 프로그램의 변경과 확장에도 유연하게 대처 가능
4) 이식 가능한 서비스 추상화
◉ PSA ( Portable Service Abstraction, 이식 가능한 서비스 추상화 )
▪︎ 스프링에서 제공하는 다양한 기수들을 추상화해 개발자가 쉽게 사용하는 인터페이스로, 추상화를 통해 코드 간결해짐
▪︎ 서로 다른 기술 스택을 사용하는 여러 환경에서 공통된 API를 사용하여 개발을 간소화하는 개념
▪︎ 데이터베이스, 원격 호출 등 다양한 기술에 대해 추상화된 API를 제공하여 개발자가 서로 다른 환경에서 일관된 방식으로 개발할 수 있도록 도와주는 역할
🗣️ 한 줄로 정리하는 핵심 개념 4가지
▪︎ IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임 워크가 대신하는 것
▪︎ DI : 외부에서 객체를 주입받아 사용하는 것
▪︎ AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것
▪︎ PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것
스프링 프레임워크는 IoC / DI를 통해 객체 간의 의존 관계를 설정하고,
AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며,
PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 한다!
'백엔드 > Spring Boot' 카테고리의 다른 글
3. 스프링 부트 3 구조 이해하기 (0) | 2023.07.12 |
---|---|
2. 스프링 부트 시작하기 (2) - 스프링 부트 둘러보고 코드 이해하기 (0) | 2023.07.11 |
48, 49 - Spring Boot : 회원가입 게시판 생성 (1) (0) | 2023.07.07 |
47 - Spring Boot : JSPCookBook 프로젝트 생성 (0) | 2023.07.05 |
46 - Spring : 의존성 주입 (0) | 2023.07.04 |