이전에 스프링부트를 사용해 프로젝트를 진행을 해 본 경험은 있지만... 제대로 이해를 하고 진행했다곤 할 수 없는 상황이었다. 그 때는 정의를 읽어도 뭐가 뭔지 하나도 몰랐을 때라... 어쩔 수 없었던 것 같음. 개발 공부는... 일단 해보고 차차 이해를 해가는 과정인 것 같다. 이런 식의 공부 방식, 순서를 처음 접해봐서 낯설고 힘들었지만, 뒤늦게 '아~ 그게 이 말이었구나!' 하고 이해하는 것도 꽤 괜찮은 경험이었던 것 같다. 사실 직접 뭔갈 만들어보는 것이 중요하지만 ㅋㅋㅋ 이제 조금씩 뭔갈 만들어볼까 하는 생각이 들긴 함. 일단 프로젝트 끝나구요~!
근데 프로젝트할 때 자바스프링을 쓰려나 노드를 쓰려나...? 혼란스러운 프로젝트...
엔터프라이즈용 Java 어플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
✔️ 기업에서 웹 서비스를 개발할 때 비즈니스 로직이라는 것이 있다. 이는 기업이 제공하는 서비스를 코드로 구현한 것을 말한다. (사용자의 요구사항을 해결하기 위한 실질적인 코드들)
스프링 등장 전에는 비즈니스 로직을 구현하기 위해서 기술 자체에 대한 공부를 추가적으로 해야 했다.
→ 기술보다 애플리케이션 로직 자체에 더 집중해서 비즈니스 로직을 구현할 수 있게 도와준다!
→ 스프링 대신 기존에 사용하던 기술들과 비교했을 때, 개발자가 작성해야 하는 코드가 상대적으로 단순하다는 의미
= 스프링을 사용함으로써 불필요하게 복잡한 코드를 제거해 코드의 복잡성을 낮출 수 있다
프레임워크 = 코드의 뼈대를 미리 만들어 둔 것
➡️ 애플리케이션 프레임워크 → 애플리케이션 개발에 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대 제공
✔️ Java EE에서 요구하는 복잡한 수준의 기능을 Java EE를 사용하지 않고 구현하기 위해서 시작했다!
✔️ 높은 수준의 기능을 손쉽게 만들어준다
✔️ 20개 이상의 서로 다른 모듈로 구성, 프로젝트 규모와 필요 기능에 따라서 여러 모듈을 조합해서 사용한다
POJO 프로그래밍
을 지향POJO = Plain Old Java Object
→ 순수 Java만을 통해서 생성한 객체
순수 Java만 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미다. ( 외부 라이브러리나 외부 모듈을 가져와서 사용하고 있다면 POJO라고 할 수 없다 = 다른 기술을 사용하지 X 순수한 Java만 사용한 객체)
→ 외부 라이브러리를 import해서 라이브러리의 메소드를 사용할 경우! 순수 Java가 아닌 외부 기술을 사용하고 있기 때문에 POJO가 아니다
→ 사용하는 기술이 더이상 사용하지 않게 되면 해당 기술을 사용하는 모든 객체들의 코드를 다 바꿔줘야 한다 (외부 모듈에 직접적으로 의존하기 때문에)
POJO는 특정 기술이나 환경에 종속되지 않는다!
→ 외부 기술이나 규약의 변화에 얽매이지 않음 = 변화와 확장에 유연하게 대처 가능
객체 지향 설계를 제한 없이 적용 가능
코드가 단순해진다 = 테스트와 디버깅이 쉬워진다
Inversion of Control (제어의 역전) / Dependency Injection (의존성 주입)
→ 스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어) 해주는 행위
일반적인 상황에서는 개발자가 객체를 직접 제어 (new
연산자를 통해 객체 생성, 의존성 주입, 초기화 등등)
→ Spring에서는 xml 파일이나 어노테이션 방식으로 스프링 컨테이너에 Bean(객체) 등록하면 스프링 컨테이너에서 Bean의 생명주기를 전부 관리해준다!
(생성 → 의존성 설정 → 초기화 → 소멸)
= 객체에 대한 제어권이 개발자에서 컨테이너로 역전되기 때문에 '제어의 역전'이라고 한다!
장점
😗 개발자가 객체 관리에 신경을 덜 쓰고 다른 부분에 더 집중할 수 있다
😗 약한 결합을 이용하여 객체 간 의존 관계를 쉽게 변경 가능
= 코드의 재사용성과 유지보수성을 높인다
→ 어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위
new
연산자를 통해서 객체를 생성하면 의존성을 스스로 만든 것이지만
객체를 스프링 컨테이너에 등록한 후 어노테이션(@Autowired
) 등을 통해 Bean을 주입하는 것이 의존성 주입!
제어의 역전은 의존성 주입의 상위 개념
Aspect Oriented Programming (관심 지향 프로그래밍)
어플리케이션 개발 시 구현해야 하는 기능은 크게 공통 관심 사항과 핵심 관심 사항으로 나뉜다.
핵심 관심 사항: 애플리케이션의 핵심 기능과 관련된 관심 사항
공통 관심 사항: 모든 핵심 관심 사항에 공통적으로 적용되는 관심 사항들 (인증, 로깅 등 전체 시스템에 공통적으로 필요한 기능에 적용)
공통 관심사항과 관련된 코드는 중복 사용되어야 함! 그렇기 때문에 이를 수행하는 로직이 변경될 경우 일일히 찾아서 수정해야 하는 일이 발생할 수 있다.
➡️ 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리해낸 다음, 분뤼된 객체의 메소드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있게 해야 한다!
= 어플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP라고 한다.
AOP를 제대로 활용하기 위해서는 많은 학습 시간이 필요함... 학습하는데 시간을 소요하기 보다는 실제 구현에 적용해가며 이해도를 높이는 것이 좋다
Portable Service Abstraction (일관된 서비스 추상화)
예를 들어 MySQL을 사용해서 개발했는데 Maria DB로 데이터 베이스르 바꿔야 하는 상황이 발생했다. 각 DB마다 사용 방법이 다르면 코드를 전부 새로 작성하거나, 일일히 수정해주어야 한다.
하지만 스프링은 그러지 않아도 됨!
➡️ 스프링이 데이터베이스 서비스를 추상화 한 인터페이스를 제공해주기 때문에 가능하다. (JDBC, Java DataBase Connectivity)
: 각 데이터베이스 회사들은 자신의 데이터베이스에 접근하는 드라이버를 Java 코드의형태로 배포한다 → 이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현한다! 때문에 DB를 바꾸어도 기존에 작성한 데이터베이스 접근 로직을 그대로 사용할 수 있다.
= 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 만든 것을 PSA라고 한다.
스프링은 여러가지 서브 프로젝트로 구성되어 있다
또한 각각의 프로젝트는 여러가지 모듈로 구성되어 있다
→ 실제 개발에서는 세부 프로젝트의 모듈을 조합해서 개발을 하게 된다
스프링으로 애플리케이션을 만들 때 필요한 설정을 간편하게 처리해주는 별도의 프레임워크
장점
→ 초기 설정을 간편하게 할 수 있다
→ 자체적인 웹 서버를 내장하고 있어서 빠르고 간편하게 배포를 진행할 수 있다
→ 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어서 클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포할 수 있다
Spring Initializr에서 프로젝트를 생성한다
참고 링크
https://www.codestates.com/blog/content/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
https://velog.io/@damiano1027/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84
이야 드디어 스프링을 나갔네요~~ 백엔드 천재가 되는 날까지 홧팅~