본문 바로가기
5.1 대외활동/Likelion(12기 세션자료)

[Eulji_LikeLion_2024_BackEnd] 2차 SpringBoot 3 기본정리

by Dohi._. 2024. 3. 2.
728x90

2차 목차  

  2-1 개발환경 마무리

    1) Postman

    2) H2

    3) Lombok

    4) 서버의 용어정리 (client , sever ,DataBase,DBMS ,IP,Port)

 

  2-2 Spring Boot 3 기본정리

    1) 스프링? 스프링 부트?

    2) Ioc/ DI / container / bean

    3)  AOP, PSA

    4) Spring Boot Starter

 

  2-3 Spring Boot 3 간단 실습

 

  2-4 추가지식(+궁금하면 봐요) 

    1) Build System  (Maven , Gradle)

 

2-1 개발환경 마무리

1) Postman

설치주소 : https://www.postman.com/downloads/

설치를 하고 자신에게 맞는 OS를 선택하여 설치해 줍니다

설치 후 로그인을 해야 프로그램을 접속이 가능해서 로그인만 일단 하고 세션도중 많이 이용하겠습니다.

 

 

2) H2

설치주소 : https://www.h2database.com/html/main.html


H2 데이터베이스를 2.1.214 버전 이상 사용해주세요

 

3) Lombok

인텔리제이 -> Setting(ctrl+alt+S) -> Plugins -> Lombok 검색후 설치!

d

4) 서버의 용어정리(Client, Sever, DataBase, DBMS. IP, Port)

보통 서비스를 운영할 때 클라이언트와 서버는 서로 관계를 맺습니다 

클라이언트는 서버에게 요청(데이터 내놔!, 저장, 수정해 줘!, 주소에 띄울 화면 내놔!) 하고

서버에서는 응답(DB에서 꺼내줄게! 수정해 줄게! 데이터 JSON! HTML! CSS 받아)을 해줍니다. 

 

또한 서비스에서는 여러 사람들이 만든 데이터를 모아서 관리하는 데이터 저장소를  DataBase라고 합니다

데이터베이스 DBMS(DataBase Management System)이라는 데이터베이스 관리 시스템으로 운영되고 관리됩니다

흔히 MySQL, Oracle(오라클), DynamoDB(다이나모디비)등이 있습니다

 

  • 데이터베이스 : 데이터의 저장소. 
  • DBMS :데이터베이스를 관리하는 시스템.
    •  관계형 DBMS(RDB) , NoSQL 등등의 종류가 있습니다 
  • SQL(Structured Query Language) 데이터 검색을 하는 언어이며 각자의 RDB마다 방언이 있지만 표준의 SQL만 공부하거나 java에서 방언을 처리해 주는 방식으로 방지합니다. 또한 NoSQL은 SQL을 안 쓰는 방향으로 도입되었지만 최근에는 SQL의 엔진을 도입하기도 하여서 RDB의 만의 언어라고도 하는 것은 애매합니다

이제 만든 서비스를 찾아가야 하는데 사용자가 찾아오려면 IP와 Port로 이루어진 주소가 필요합니다

IP Port는 간단하게 말하면 IP는 서로 통신하기 위한 주소입니다 그리고 Port는 동 호수라고 생각하면 편합니다.

문제는 여기서 IP의 주소는 너무 광범위하기 때문에 저희가 제공하는 디테일한 주소로 와야 합니다.

그때 필요한 것이 Port입니다.

예를 들어 회사의 고객센터를 가려고 하는데

회사의 도로명주소만 안다고 찾아가도 숨겨놓은 고객센터 위치를 모르기 때문에 고객센터의 층과 호수를 알아야 

바로 고객센터를 찾아갈 수 있을 것입니다.

Java Spring의 기본 Port는 8080이고 언제나 옮길 수 있습니다.


2-2 Spring Boot 3 기본정리

1) 스프링? 스프링 부트?

  

소프트웨어 분야가 발전하면서 대규모의 복잡한 데이터를 관리하는 애플리케이션(엔터프라이즈 애플리케이션)은 점점 복잡해졌습니다 

그러다 보니 개발자는 전체적으로 신경 쓰면서 보안,안정성,서버제작을 하면서 로직,기능까지 개발하기엔 어려웠습니다.

스프링 프레임워크(Spring framework)는 위에서 언급한 서버,안정성,보안을 제공하는 프레임 워크였고 

개발자는 기능과 로직에만 집중을 할 수 있습니다 

하지만 Spring framework의 문제점은 로직과 기능만을 집중할 수 있는 프레임워크이지만

설정을 하기에는 너무 복잡하고 어렵습니다

어려움을 해결 하기 위해서 스프링 부트가 나왔습니다

 

스프링 부트(Spring Boot)는 스프링에 속한 도구이지만 몇 가지의 차이가 있습니다

 

차이점

  •  WAS : 웹애플리케이션을 실행하기 위한 장치
    • Spring Boot 내부에 Tomcat이 포함되어서 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어준다. (톰캣,제티,언더토우등등)
  • Spring Boot starter을 통한 dependency 자동화 
    • Spring Boot starter : 손쉽게 원하는 라이브러리를 import 할 수 있다.
    • starter는 간편하게 dependency를 제공해주는데, 만약 우리가 JPA가 필요하다면 pom.xml(메이븐)이나 build.gradle(그레이들)에 'spring-boot-starter-data-jpa'만 추가해주면 spring boot가 그에 필요한 라이브러리들을 알아서 받아온다.
  • XML설정을 하지 않아도 된다.
요약 Spring framework Spring Boot 
설정 파일 수동 자동
XML 일부 파일은 XML직접관리 사용하지않아도됨
WAS 별도로 설치,수동 설정 제공하여 별도의 설정 필요없음
인메모리 DB 지원하지 않음  자동 설정 지원( H2 ,HSQL,Derby)
dependency (의존성) 수동설정 자동화 가능

 

 

2) Ioc / DI / container / bean 

스프링을 공부하다보면 IoC(제어의 역전)과 DI(의존성 주입)을 알면 스프링이라는 프레임워크가 돌아가는 원리를 이해하기 편합니다.

왜냐하면 스프링의 대부분 기능은 IoC와 DI에 기반을 두고 있기 때문입니다.   참고 :스프링 공식문서

 

IoC ( 제어의 역전 / Inversion of Control )

자바를 공부하다보면 객체는 항상 필요한 곳에서 직접 생성을 했을 것입니다.

dohi = new Dohi(); //new 키워드로 클래스Dohi의 객체 생성

IoC는 객체를 직접 생성, 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와서 사용하는 것을 뜻합니다

스프링에 적용을 해보면 스프링은 스프링 컨테이너가 객체를 관리,제공하는 역할을 합니다 

private Dohi dohi; //객체를 코드에서 생성하는 것이아니라 받아온 객체를 dohi에할당

 

DI ( 의존성 주입 / Dependency Injection )

위에서 본 것처럼 스프링에서는 객체를 관리할때 IoC(제어의 역전)을 사용합니다.

스프링 컨테이너가 생성한 객체를 클래스가 의존한다고 생각하면 편합니다. 

의존이라고 하면 더 어려워진다면 객체가 필요할때마다 스프링 컨테이너에 주입받아 사용한다고 생각하면 편합니다.

 

예시

public class DiTest{
	@Autowired
	Dohi dohi;
}
*@Autowired
DI을 할 때 사용하는 애노테이션 : 의존 객체의 타입에 해당하는 빈(Bean)을 찾아 주입하는 역할을 합니다.

 

기존 코드들은 생성자를 사용해서 직접 생성을 했어야 했지만 위에 예시코드는 DiTest class에서 Dohi라는 객체를 dohi에 주입받아서 사용합니다

Ioc/DI는 중요한 개념이고 Spring의 메인 개념입니다

 

스프링 컨테이너(Spring Container)

IoC를 설명하다 스프링 컨테이너에 대해서 이야기했습니다 간단하게 스프링의 빈(Bean)을 생성하고 관리합니다.

스프링 컨테이너는 IoC Container 혹은 DI Container 라고도 불리는데 컨테이너가 IoC 혹은 DI를 주로 진행하기 때문이다.

즉, 스프링 컨테이너는 스프링 Bean들을 생성하고 관리를 한다고 생각하면 편합니다.

또한 @Autowired와 같은 애너테이션을 사용해서 빈을 주입받을수 있게 DI를 지원하기도 합니다.

 

+ 추가 지식 

스프링 컨테이너는 BeanFactory와 ApplicationContext로 주로 나눌수가 있습니다 (참고사이트)

  • BeanFactory
    • Bean 관리, 조회를 담당
    •  스프링 컨테이너의 중심이 되는 인터페이스
  • ApplicationContext
    • BeanFactory 기능을 모두 상속받고 추가 기능제공
    • 메시지 소스 기반 국제화 기능
    • 애플리케이션 이벤트 관리
    • 더 많은 기능이 있습니다 (리소스 조회, 환경변수등등)

 

보통 스프링 컨테이너라고 하면 ApplicationContext를 뜻합니다.

BeanFactory의 모든 기능을 상속받는데다가 편리한 추가기능을 제공하기 때문입니다.

 

 

스프링 빈(Bean)

스프링 컨테이너에 의해 관리되고 애플리케이션의 핵심을 이루는 객체들을 스프링 빈이라고 부릅니다.

스프링 빈은 스프링 컨테이너에 의해 인스턴스화되어 조립,관리되는 객체

즉, 스프링 빈은 스프링의 객체로 이해하면 편합니다

 

스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML파일 설정,애너테이션 추가 등 여러방법을 제공합니다.

예를들어 DoHi라는 클래스에 @Component 애너테이션을 붙이면 DoHi 클래스가 빈으로 등록됩니다.

그럼 스프링 컨테이너에서는 Dohi 클래스를 빈으로써 클래스의 첫글자를 소문자로 바꿔서 관리하게 됩니다

Class : DoHi  →  Bean : doHi
@Component //Class (DoHi)를 Bean (doHi)으로 등록  
public class DoHi{
}​

 

3)  AOP , PSA 

AOP (관점 지향 프로그래밍 / Apsect Oriented Programming)

관점 지향 프로그래밍은 직관적으로 이야기를 하면 "관점을 기준으로 기능을 분리하는 프로그래밍"이라는 것인데요

좀 더 풀어서 이해를 해보면 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미합니다.

예를 들어 버스표를 예약하는 프로그램이 있다면

핵심 관점은 결제 , 고객 정보 관리 라고 합시다 

결제에는 일어나고 있는 일들을 기록하는 로깅로직 결제내역을 저장하는 DB연결 등등

고객 정보 관리는 일어나고 있는 일들을 기록한 로깅로직, 결제내역및 예매표를 저장하는 DB연결 등등

 

DB연결과 로깅은 부가 관점으로 볼 수 있습니다

 

부가관점에 해당하는 로직을 모듈화해서 핵심 관점 코드에서 분리할 수 있게 해줍니다

결과적으로 핵심 관점 코드에만 집중할 수 있게 되며 프로그램의 변경과 확장에도 유연하게 대응이 가능해집니다.

 

PSA (이식 가능한 서비스추상화 / Portavle Service Abstraction)

이식 가능한 서비스 추상화는 스프링에서 제공하는 다양한 서비스(기술)들을 추상화해서 개발자가 쉽게 사용하는 인터페이스를 말합니다

간단하게 말하면 어느 기술을 사용하더라도 일관된 방식으로 처리하도록 하는 것 이라고 이해하면 될 것 같습니다

 

예시로 DataBase에 접근하는 기술중 JDBC, MyBatis, JPA가 있고  WAS도 톰캣, 언더토우, 네티 같은 것들을 

기존에 사용하는 코드들을 그대로 사용할 수 있게 하는 것이 대표적인 PSA라고 생각하면 편합니다.

 

요약
환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙
예를 들어 데이터베이스에 관계없이 동일하게 적용 할 수 있는 트랜잭션 처리 방식

 

 

지금까지 스프링의 주요 콘셉인 IoC,DI, AOP,PSA에 대해서 알아보았습니다 

Spring boot에대해서 들어가기전에 이해하고 넘어가는 것이 좋습니다!

 

 

4) Spring Boot starer

 

스프링 부트 스타터는 의존성이 모여 있는 그룹으로 필요한 기능을 간편하게 설정이 가능합니다.

또한 스타터는 spring-boot-starter-{작업유형} 이라는 명명규칙이 있다.

이규칙을 이용해서 필요한 기능을 찾을때 스타터를 쉽게 찾을 수 있을 것입니다

자주 사용하는 스타터를 한번 둘러 보면

스타터 설명
spring-boot-starter-web SpringMVC를 사용하여 RESTful 웹 서비스 개발할 때 필요한 의존성 모음
spring-boot-starter-test 테스트하기 위한 필요한 의존성 모음
spring-boot-starter-validation 유효성 검사를 위한 의존성 모음
spring-boot-starter-actuator 모니터링을 위해 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음
spring-boot-starter-data-jpa ORM을 사용하기 위한 인터페이스의 모음인 JPA를 쉽게 사용하기 위한 의존성 모음

 


2-3. Spring Boot 3 간단하게 실행해보기

스프링 부트 스타터(https://start.spring.io/) 에서 만들겠습니다.

Project: Gradle - Groovy 
사용 기능: web, thymeleaf, jpa, h2, lombok, validation
java: 17이상

 

 

Spring 파일에서 TestController.java를 만들어 본후에 아래 코드를 입력해 봅시다 

@RestController //@Controller에 @ResponseBody가 결합된 애너테이션
public class TestController {
	@GetMapping("/test") 
	public String test() {
		return "Hello, world!";
	}
}

해당 코드를 run을 하고 브라우저에서 localhost:8080/test로 접속을 하면 

return값인 "Hello, world!"가 출력이 됩니다

 

이유는

@GetMapping에서 설정한 경로즉 /test에 접속을 하였고 

클라이언트에서 보낸 get요청에 대해 test()함수의 리턴값을보내줬기 때문입니다

 

경로의 의미는 아래와 같습니다.

http://localhost:8080/test
localhost  → 현재 사용 중인 컴퓨터 (ip 127.0.0.1)
8080 → 포트번호 (스프링 부트의 포트 번호)
test → 경로 (해당 경로로 메서드와 매핑이 됨)

 


2-4. 추가지식(+궁금하신분만)

빌드 시스템에 있는  Gradle Maven은 소스 코드를 이용해서 의존성 관리, 컴파일 테스트 코드.. 등등등 많은 일처리를 자동화하여 실행 가능한 애플리케이션을 만드는  프로그램입니다.

 

Gradle Maven의 둘의 차이는

예전에 많이 사용한 Maven의 경우 XML로 라이브러리를 정의

비교적 최근에 나온 Gradle의 경우 별도의 빌드 스크립트 언어로 구성

즉, Gradle은 Maven의 XML에 비해 가독성이 좋고 설정이 간단합니다.

 

차이점 비교를 위한 코드예시
Spring Version : 2.5.0
Java    Version :17

pom.xml(Maven)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>spring-boot-java17</artifactId>
    <version>1.0.0</version>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

build.gradle (Gradle)

plugins {
    id 'org.springframework.boot' version '2.5.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}

test {
    useJUnitPlatform()
}

설정이 간단하고 가독성이 좋으며 빌드와 테스트 속도가 Maven에 비해 Gradle이 더 빠르고 우세하다!

요즘에는 그래서 Gradle을 사용하지만 
이미 적응된 방식을 바꾸려고 팀전체가 다시 학습을 진행하기도 그렇고
이미 Maven의 자료가 많아서 Gradle과 Maven이 서로 양립하고 있다만 알면 좋을 것 같습니다 

 

 


이 글은 을지대학교 백엔드 세션 강의를 위해 제작된 게시글입니다 
언제나 조언부탁드립니다

 

 

728x90

댓글