
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.2)
1) Java 웹 프레임워크로 Java 언어를 기반으로 한다
2) Java 기반의 웹 어플리케이션을 만들 수 있는 백엔드 프레임워크
3) 수많은 국내 기업과 해외 기업에서 많이 사용하는 프레임워크
다양한 곳에서 정말 많이 사용하고 있고, 백엔드 개발자를 꿈꾸고 있다면 필수로 배워야 하는 프레임워크이다!
Java에서 객체 생성
→ Sample 클래스에서 new 키워드로 Apple 클래스의 객체를 생성

스프링 컨테이너가 객체 관리
→ Apple 객체의 제어권이 Sample 에 있는 것이 아닌, SampleTest 클래스에게 있음
→ 의존성을 역전시켜 제어권을 직접 갖지 않는 것이 IoC!

구성 요소의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일을 통해 정의된다
즉, 외부에서 객체를 주입 받아 사용한다
DI(의존성 주입) 방법으로 IoC(제어 역전) 를 구현한다
이를 통해 코드 간의 재사용률을 높이고, 모듈 간의 결합도를 낮출 수 있다
DI(의존성 주입) 하는 방법
1) Field Injection (필드 주입)

2) Setter Injection (수정자 주입)

3) Constructor Injection (생성자 주입 )

특정한 코어 관심사항에서 분리된 프로그래밍 측면을 말한다
어떤 로직을 기준으로 "핵심 관점", "부가 관점(로깅, 보안, 트랜잭션 등)"으로 나누어서 보고 그 관점을 기준으로 각각 모듈화한다
기능을 비즈니스 로직과 공통 모듈로 구분한 후, 개발자의 코드 밖에서 필요한 시점에 비
즈니스 로직을 삽입하여 실행되도록 한다
여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 기법 -> 개발자는 핵심 관점 코드에만 집중할 수 있다
다른 기술을 사용하지 않고 순수 Java만을 통해서 생성한 객체
ex) 필드, getter, setter만 존재하는 기본적인 Java 오브젝트

POJO는 왜 중요할까?
외부 라이브러리를 import 해서 특정 객체를 사용한다면? (즉, POJO 가 아닌 객체)
해당 기술이 deprecated(더 이상 사용되지 않음) 되거나 새로운 기술로 변경되면 관련 코드를 모두 변경해야 하는 번거로움이 있다
해당 객체가 외부 라이브러리에 의존적인 상황은 좋지 않다!
객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
Spring Boot는 스프링 프레임워크를 기반으로 하는 프로젝트이다
스프링 부트의 주요 목표는 스프링 기반의 애플리케이션 개발을 더욱 빠르고, 쉽고, 편리하게 만드는 것이다
Spring은 필요한 여러 설정 (ex 톰캣 서버 설정, XML 설정, …) 이 복잡하다는 단점이 있다
Spring Boot는 쉽고 빠르게 스프링 프레임워크를 사용할 수 있는 도구이다!
WAS가 내장 되어 있어 독립적으로 실행 가능
WAS(Web Application Server): 웹 애플리케이션 서버. 웹 애플리케이션과 서버 환경을 연결하는 역할을 한다
스프링 부트는 톰캣(Tomcat), 제티(Jetty), 언더토우(Undertow)와 같은 서버(AWS)를 내장하고 있어, 별도의 WAS 설치 없이도 웹 애플리케이션을 실행시킬 수 있다
스프링 부트 스타터(Starter)
개발에 필요한 빌드 구성을 단순화하는 스프링 부트 스타터 제공
스타터는 스프링과 다른 라이브러리의 의존성 관리를 쉽게 해준다
그렇기 때문에, 개발자는 복잡한 의존성 구조를 자세히 알지 못해도 필요한 라이브러리를 쉽게 가져와 사용할 수 있다
애플리케이션 설정을 XML 이 아닌 Java 코드 작성 가능
개발자가 더 직관적이고 유연하게 애플리케이션 설정 가능
JAR 이용해 자바 옵션 만으로도 배포 가능
JAR(Java Archive 자바 아카이브) 파일: 애플리케이션과 의존 라이브러리들을 하나의 파일로 묶은 형태
배포 및 실행 환경에서 별도의 설정이 필요 없다는 장점 (애플리케이션 이식성과 배포 과정 단순화)
JAR 파일로 패키징해 배포 가능
https://start.spring.io
Spring Boot 기반으로 Spring 관련 프로젝트를 만들어주는 사이트다
Spring에서 운영하고 있으며, 해당 사이트에서 원하는 라이브러리를 선택 후 프로젝트 생성 가능!

💡용어 설명
Project: 생성할 프로젝트의 빌드 자동화 툴
Language: 생성할 프로젝트의 언어
Spring Boot: 스프링 부트 버전
Project Metadata: 프로젝트 정보
Dependencies: 프로젝트 의존성. 여기에 추가한 디펜던시가 build.gradle 파일에 추가된다
나는 여기에 Spring Web, Thymeleaf, Lombok을 추가해 주었다
Spring Web: 스프링 기반으로 웹 개발
Thymeleaf: Java XML/XHTML/HTML5 템플릿 엔진
lombok : 코드를 간단하게 쓰게 해주는 라이브러리 (코드 다이어터 라이브러리)
generate 클릭 → 압축 파일이 생성되는데 압축을 풀고 그 폴더를 원하는 프로젝트 경로로 옮긴다 → intelliJ로 프로젝트 열면 끗!

위의 구조는 Sping MVC 구조이다
.gradle/wrapper : graddle 관련해 사용하는 폴더
src : 프로젝트 소스 코드가 있는 폴더
scr/main : 실제 소스 코드가 있는 폴더
src/main/java : 여기서 코딩함
src/main/resources : 여기서 설정하기. 정적파일 등이 있음
src/test: 테스트 코드

1) 9번 줄의 ▶ 버튼을 눌러 main함수를 실행시키거나,
2) 오른쪽 위의 'Run Application' ▶ 버튼(단축키: shift + F10 (windows) / ctrl + R (MAC))을 누르면
spring boot 프로젝트가 실행되고, localhost:8080 주소로 접속 가능하다!
💡수정, 변경사항이 있을 때마다 build 해야 한다
intelliJ의 설정을 바꾸면 node.js의 nodemon처럼 자동 빌드하게 할 수 있지만, 컴퓨터에 좋지 않을 수 있으니 나는 하지 않았다