빌드 도구
- 소스 코드에서 애플리케이션 생성을 자동화 하기 위한 프로그램
- 코드를 사용 | 실행 가능한 형태로 컴파일, 코드 패키징, 테스트 실행 등을 포함
빌드 도구의 종류
- Maven VS Gradle
- 1) Maven : 고정적이고 선형적인 단계의 모델을 기반
- 2) Gradle : 작업 의존성 그래프를 기반
차이점
- Gradle이 Maven에 비해 가독성이 높고 설정이 간단
- Gradle이 빌드와 테스트 속도가 더 빠르다
Spring Boot
bulid.gradle 수정
더보기
plugins {
id 'java'
// 프로젝트에 사용할 스프링부트 플러그인 | 스프링의 의존성을 자동 관리하는 플러그인
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '17' // 자바 소스 컴파일 버전
repositories {
// 의존성을 받을 저장소 지정
mavenCentral()
}
dependencies {
// 프로젝트 개발에 필요한 기능인 의존성을 입력
// : 스프링부트 웹 관련 기능 제공 | 테스트 기능을 제공
implementation('org.springframework.boot:spring-boot-starter-web')
testImplementation('org.springframework.boot:spring-boot-starter-test')
// 스프링 데이터 JPA
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
// 데이터베이스 h2 사용
runtimeOnly('com.h2database:h2')
// 반복 메서드 작성 작업을 줄여주는 라이브러리
compileOnly('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
}
test {
useJUnitPlatform()
}
기본 실행 환경
더보기
package org.example.springbootdeveloper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
Postman
- API 테스트를 위해 HTTP 요청을 보낼 수 있는 클라이언트 프로그램
- https://www.postman.com/downloads
- 접속하여 설치
더보기
API란?
- 사용자와 서버가 통신을 하기 위한 인터페이스
- open API: 누구나 사용할 수 있도록 공개된 API
- REST API: 주로 HTTP를 사용해 서버-클라이언트 간에 데이터를 주고 받을수 있는 API
스프링 (프레임워크) VS 스프링부트
1. 스프링(프레임워크)
- 대규모의 복잡한 데이터 관리를 대비하기 위한 서버 성능, 안정성, 보안을 제공하는 도구
2. 스프링부트
- 빌드 구성을 단순화하는 스프링 부트 스타터를 제공
- XML 설정을 하지 않고도 자바 코드로 작성이 가능
- JAR를 이용하여 자바 옵션만으로 배포 가능
스프링과 스프링부트의 차이
- 1) 구성의 차이
- 스프링 코어 | 스프링 MVC에 있는 기능을 자동 로드 (수동 환경 구성 X)
- 2) 내장 WAS의 유무
- 스프링부트는 WAS를 자체적으로 가진다
- jar 파일만 생성하면 별도로 WAS를 설정하지 않아도 애플리케이션 실행이 가능
IoC_ DI (중요!!)
1. 제어의 역전 (IoC; Inversion of Control)
- 프로그램의 제어 흐름을 개발자가 아닌 외부 컨테이너에 위임하는 방식
- 제어의 권한이 컨테이너에게 넘어가 객체의 생명 주기를 컨테이너가 관리
더보기
cf) 전통적인 프로그래밍
- 개발자가 객체의 생성부터 소멸까지 직접 제어
class Book {
private String title;
public Book(String title){
this.title = title;
}
public String getTitle(){
return this.title;
}
}
// 전통적인 자바 코드 방식: 객체의 생성과 관리를 개발자가 직접 정의
class BookStore1 {
private Book book;
public BookStore1 () {
// 개발자가 직접 Book 객체를 생성
this.book = new Book("Java 기초");
}
public void displayBook() {
System.out.println("Book: " + book.getTitle());
}
}
public class e_IoC_DI {
public static void main(String[] args) {
BookStore1 store1 = new BookStore1();
store1.displayBook();
}
제어의 역전 (IoC)
@Component
class Book2 {
private String title;
public Book2() {
// 스프링 컨테이너가 객체를 생성하고 설정을 관리
this.title = "스프링 기초";
}
public String getTitle() {
return this.title;
}
}
@Component
class BookStore2 {
private Book2 book;
@Autowired
public BookStore2(Book2 book) {
// 스프링 컨테이너가 Book2 객체를 주입
this.book = book;
}
public void displayBook() {
System.out.println("Book2: " + book.getTitle());
}
}
public class e_IoC_DI {
public static void main(String[] args) {
}
}
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
@Bean
public CommandLineRunner run(ApplicationContext ctx) {
return args -> {
BookStore2 store2 = ctx.getBean(BookStore2.class);
store2.displayBook();
}
}
}
2. 의존성 주입 (DI; Dependency Injection)
- 제어의 역전을 구현하기 위해 사용하는 방법 -> 어떤 클래스가 다른 클래스에 의존한다
- 객체 간의 결합도를 낮추고, 유연성과 재사용성을 높이며 코드의 테스트가 용이
- 생성자 주입, 필드 주입, 세터 주입 등의 방식으로 이루어짐
더보기
public class A {
@Autowired
// 스프링 컨테이너에 있는 '빈' 이라는 것을 주입하는 역할
// cf) 빈(Bean - 콩)
// : 스프링 컨테이너에서 관리하는 객체
B b;
}
스프링 컨테이너(Spring Container)
- 애플리케이션 내에서 객체(빈)의 생명 주기와 설정을 관리
- 애플리케이션을 구성하는 빈들을 생성, 조립, 관리
- 이를 통해 제어의 역전(IoC)을 실현
- 의존성 주입(DI)를 지원
빈(Bean)
- 스프링 컨테이너가 관리하는 객체를 의미
- 개발자에 의해 명시적으로 정의 | 스프링에 의해 자동으로 감지되어 관리
- 주로 서비스, 리포지토리, 컨트롤러 등의 역할을 수행하는 컴포넌트로 사용
- 선언방법 : XML 파일 사용, 애너테이션 사용(@Component, @Service, @Repository 등), 자바 설정 클래스에서 @Bean 애너테이션 사용으로 선언 가능
관점 지향 프로그래밍 (AOP; Aspect Oriented Programming)
- 애플리케이션의 핵심 로직과 공통적인 관심사를 분리하여 관리하는 기법
- 모듈화를 지향
- 로그, 보안, 트랜잭션 관리와 같은 공통적인 관심사를 핵심 비즈니스 로직과 분리하여 유지보수성과 코드 가독성을 향상
이식 가능한 서비스 추상화(PSA; Portable Service Abstraction)
- 특정 기술에 의존하지 않고 다양한 환경에서도 동일하게 동작할 수 있는 스프링의 추상화
- 어떤 기술을 사용하든 일관된 방식으로 DB에 접근하도록 인터페이스를 지원
스프링부트 스타터
- 1) spring-boot-starter-web : Spring MVC를 사용하여 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음
- 2) spring-boot-starter-test : 스프링 애플리케이션의 테스트를 위한 의존성 모음
- 3) validation : 유효성 검사
- 4) actuator : 모니터링을 위한
- 5) data-jap : ORM을 사용하기 위한 인터페이스 모음인 JPA를 쉽게하기 위함
스프링부트의 구조
- 클라이언트 - Controller - Service - Repository - 데이터베이스
1) 프레젠테이션(Presentation) 계층
- 컨트롤러(Controller)
- HTTP 요청을 받고 해당 요청을 비즈니스 계층으로 전송하는 역할
2. 비즈니스(Business) 계층
- 서비스(Service)
- 모든 비즈니스 로직을 처리
- 비즈니스 로직: 서비스를 만족하기 위한 로직, 웹 사이트에서 벌어지는 모든 작업
3. 퍼시스턴스(Persistence) 계층
- 리포지토리(Repository)
- 모든 데이터베이스 관련 로직을 처리
- DB에 접근하는 DAO 객체를 사용 가능
- DAO: 데이터베이스와 상호작용을 위한 객체
'SpringBoot' 카테고리의 다른 글
[SpringBoot] JpaRepository (0) | 2024.10.17 |
---|---|
[SpringBoot] ORM, JPA (0) | 2024.10.16 |
[SpringBoot] 테스트 코드 (0) | 2024.10.16 |
[SpringBoot] DispatchServlet (0) | 2024.10.14 |
[SpringBoot] 기본 예제 코드 (0) | 2024.10.14 |