spring이란?
자바 기반의 오픈소스 프레임워크이다.
왜 spring을 써야하는가?
1.경량성
스프링은 경량성을 지향하는 프레임워크이다. 스프링은 작은 규모부터 대규모의 애플리케이션까지 적합하며, 컨테이너와 모듈들이 각각 독립적으로 작동하기 때문에 자원을 효율적으로 사용할 수 있습니다.
( 경량하다?
- 작업을 더 빠르게 처리가능
- 더 적은 메모리와 리소스를 사용=> 복잡성👇,구현👆,간단하고 직관적인 API와 높은 수준의 추상화를 제공 => 개발자의 일처리 효율 올라감(생산성 up)
- IoC와 DI
스프링은 IoC (Inversion of Control)와 DI (Dependency Injection)를 지원합니다. IoC는 객체를 생성하고 의존성을 연결하는 작업을 개발자가 아닌 스프링 컨테이너가 대신 수행한다는 것을 의미합니다. DI는 의존성 주입을 통해 느슨한 결합을 구현할 수 있습니다.
==>유지보수성과 테스트 용이성을 높여줍니다.- AOP
스프링은 AOP(Aspect-Oriented Programming)을 지원합니다. AOP는 핵심 비즈니스 로직과 공통 기능을 분리하여 관리하고, 핵심 로직에서 공통 기능을 호출할 수 있습니다. 이는 로깅, 보안, 트랜잭션 관리 등에서 많이 활용됩니다.- 통합(Integration)
스프링은 다양한 기술과 통합할 수 있는 방법을 제공합니다. JDBC, JPA, Hibernate, MyBatis 등 데이터베이스 기술과, RESTful, SOAP 등 웹 서비스 기술, 그리고 스케줄링, 메시지 큐, 캐시 등의 기술과도 쉽게 통합할 수 있습니다.- 보안(Security)
스프링은 보안 기능을 제공합니다. 스프링 시큐리티(Spring Security)는 인증과 인가, 접근 제어, 보안 이벤트 처리 등의 보안 기능을 제공하여 애플리케이션의 보안을 강화할 수 있습니다.
기본적으로 알아야할 것
(좌측 기준으로)
1. src/main/resources 디렉터리
src/main/resources 디렉터리는 자바 파일을 제외한 HTML, CSS, Javascript, 환경파일 등을 작성하는 공간이다.
templates 디렉터리
src/main/resources 디렉터리의 하위 디렉터리인 templates 디렉터리에는 템플릿 파일을 저장한다.
템플릿 파일? HTML 파일 형태로 자바 객체와 연동되는 파일이다. templates 디렉터리에는 HTML 파일을 저장한다.static 디렉터리
static 디렉터리는 SBB 프로젝트의 스타일시트(.css), 자바스크립트(.js) 그리고 이미지 파일(.jpg, .png) 등을 저장하는 공간이다.application.properties 파일
application.properties 파일은 프로젝트의 환경을 설정한다. 프로젝트의 환경, 데이터베이스 등의 설정을 이 파일에 저장한다.src/test/java 디렉터리
src/test/java 디렉터리는 프로젝트에서 작성한 파일을 테스트하기 위한 테스트 코드를 작성하는 공간이다. JUnit과 스프링부트의 테스팅 도구를 사용하여 서버를 실행하지 않은 상태에서 src/main/java 디렉터리에 작성한 코드를 테스트할 수 있다.build.gradle 파일
그레이들(Gradle)이 사용하는 환경 파일이다. build.gradle 파일에는 프로젝트를 위해 필요한 플러그인과 라이브러리 등을 기술한다.(들어가보면 dependencies 부분에 내가 이 프로젝트를 위해서 어떤걸 추가했는지 알 수 있다.
추가 DI에 대해서
- DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다. (실행 중에 동적으로 변한다는 것은 내가 프로그램을 실행하고 있는데 뭐 새로운 게 추가돼서 바로 돌린다 등이 동적으로 변하다의 의미로 알면 된다)
ex)@Controller public class MainController { @Autowired private UserService userService; //==> 필드 주입 방법 @Autowired //==> 생성자 주입 방법 public MainController(UserService userService){ this.userService = userService; } @Autowired // ==>세터주입 public void SetUserService(UserService userService){ this.userService = userService; } }
왜 생성자 주입 방식을 권장하는가?
1. 필드 주입은 한 번에 선언되어버리니까 내가 바꿀 수 있는 방법이 잘 없다
2. 세터 주입은 누군가가 호출할 때 set 메 서드가 public으로 열려있어야 한다 그래서 퍼블릭 하게 노출되기 때문에(즉 아무 개발자나 다 가져다가 쓸 수 있어서)