Spring Day1 Spring Framework

김지원·2022년 6월 12일
0

Spring

목록 보기
1/3

프레임워크를 이해하기 전 라이브러리를 먼저 이해해보자.

라이브러리 : 도서관

만화가 보고싶다고 그려서 보지 않는다. 이미 누군가가 그려논 만화를 직접 빌려서 읽는다.
선배 개발자들이 이미 작성해놓은 소스 파일을 가져와서 사용하는 것이다.
이 라이브러리들이 모여있는게 API이다.

쉽게 얘기하면 라이브러리가 덩치가 커지면 프레임워크이다.

개발자들은 개인적인 차이가 생길 수 밖에 없다. 실력이 부족한 사람을 채용하지 않거나 짜르는 것이아닌 개개인의 실력을 상향평준화를 하자 해서 생긴게 프레임워크다.

우리는 프레임워크에서 어떤걸 빼고 추가하고 수정할지 배운다.

라이브러리들이 이미 똑같이 갖춰져있는 그 환경을 제공하는 걸 프레임워크이다.

프레임워크(Framework)란?

뼈대나 근간을 이루는 코드들의 묶음.
개발자는 각 개개인의 능력차이가 큰 직종이고, 개발자 구성에 따라 프로젝트 결과 역시 큰 차이를 낳는다. (서비스를 클라이언트에게 동일한 품질을 제공해야한다.)
이런 상황을 극복하기 위한 코드의 결과물이 바로 프레임워크이다.

프로그램의 기본 흐름이나 구조를 정하고 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다.

프레임워크의 장점

개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에, 실력이 부족한 개발자라
하더라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다.

회사 입장에서는 프레임워크를 사용하면 일정한 품질이 보장되는 결과물을 얻을 수 있고,
개발자 입장에서는 완성된 구조에 자신이 맡은 코드를 개발해서 넣기 때문에 개발 시간을 단축할 수 있다.

스프링 프레임워크의 장점

경량 프레임워크(light-weight) : 무게가 가볍다.

예전 프레임워크는 다양한 경우를 처리할 수 있는 다양한 기능을 가지도록 만들다 보니
하나의 기능을 위해서 너무 많은 구조가 필요했다.
기술이 너무나 복잡하고 방대했기 때문에, 전체를 이해하고 개발하기에는 어려움이 많았다.

그래서 스프링 프레임워크가 등장했고, 특정 기능을 위주로 간단한 JAR파일 등을 이용해서 모든 개발이 가능하도록 구성되어 있다.


스프링 프레임워크의 구체적인 장점

  • 복잡함에 반기를 들어서 만들어진 프레임워크
  • 프로젝트 전체 구조를 설계할 때 유용한 프레임워크
  • 다른 프레임워크들의 포용(여러 프레임워크를 혼용해서 사용가능)
  • 개발 생산성과 개발도구의 지원

스프링 프레임워크의 특징

  • POJO 기반의 구성
  • 의존성 주입(DI)을 통한 객체 간의 관계 구성
  • AOP(Aspect-Oriented-Programming) 지원
  • 편리한 MVC 구조
  • WAS의 종속적이지 않은 개발 환경

1. POJO(Plain Old Java Object) 기반의 구성

오래되고 간단한 자바 객체 방식을 기반으로 구성되었다. = 자바를 사용할 수 있다.

오래된 방식의 간단한 자바 객체라는 의미이며, JAVA 코드에서 일반적으로 객체를 구성하는 방식을 스프링 프레임워크에서 그대로 사용할 수 있다는 말이다.

2. ❗️의존성 주입(DI)을 통한 객체 간의 관계 구성

레스토랑클래스 셰프클래스를 예로 들어보자.

셰프는 레스토랑에서만 쓰이나? 레스토랑이 없어도 먹고 살 수 있다. 그렇다면 반대로 생각해보자 레스토랑을 차렸는데 셰프가 없으면 안된다. 레스토랑은 반드시 셰프가 필요하다. 레스토랑이 셰프에게 의존한다.
=> 레스토랑에 셰프 객체화를 한다. 이게 두 객체 간의 의존성이다.

그런데 이런 상황에서는 이런 객체를 받고 저런 상황에서는 저런 객체를 받아야하는데 레스토랑 클래스 안에서 셰프를 만들어버리면 프랑스 셰프가 들어오지 못한다.
=> 결합이 너무 단단해서 유연하지 못하다.

의존성의 결합이 단단하기 때문에 느슨하게 하는게 필요하다. 이게 바로 '주입(Injection)'이다.

의존성 (Dependency)

의존성(Dependency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미한다.

예를 들어 A객체가 B객체 없이 동작이 불가능한 상황을 'A'가 'B'에 의존적이다 라고 표현한다.

주입(Injection)

주입(Injection)은 말 그대로 외부에서 밀어 넣는 것을 의미한다.

예를 들어 어떤 객체가 필요한 객체를 외부에서 밀어 넣는 것을 의미한다.
주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없고 어떤 객체에 의존하든
자신의 역할은 변하지 않게 된다. (외부에서 주입을 받고 내가 new를 하는게 아니니깐 어딘가에 의존하는 의존성, 결합성이 느슨해지기 때문이다. 필요한 상황에 따라서 유연하게 들어온다.)

=> 🐣 이해하기 쉬운 한줄 정리
내가 막 설계를 하다보니 객체가 여러개 나왔다. 그러다 보니 이 아이가 쟤가 없으면 안되는 상황이 생겨서 결합을 했더니 결합성이 단단해지다보니 이 아이를 외부에서 요청해서 주입을 받아 유연한 개발을 하자.


의존성 주입(DI)을 통한 객체 간의 관계 구성

의존

ⓐ → → → → → → → → ⓑ
a객체에서 b객체를 직접 생성

의존성 주입

ⓐ → → → ??? ↔ ↔ ↔ ⓑ
a는 b가 필요하다는 신호만 보내고, b객체를 주입하는 것은 외부에서 이루어짐 (?가 알아서 b를 찾아온다.)

의존성 주입방식을 사용하기 위해서는 ???라는 존재가 필요하게 된다.

ApplicationContext == ???

스프링 프레임워크에서는 ApplicationContext가 ???라는 존재이며,
필요한 객체들을 생성하고, 필요한 객체들을 주입해주는 역할을 한다.

어노테이션을 하나쓰면 ApplicationContext가 어노테이션이 작성된 클래스를 context라는 임시영역에 올려준다.(대기상태)
요청을 받으면 올라가있는 객체 중 필요한 애들을 선택해 주입해준다.

따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고,
이러한 객체들을 엮는(wiring)작업의 형태로 개발하게 된다.
(우리가 연결하는게 아니라 자동으로 해주는데 @Autowired로 나중에 쓰인다.)

ApplicationContext가 관리하는 객체들을 '빈(Bean)'이라 부르고,
빈과 빈 사이의 의존 관계를 처리하는 방식으로는 XML방식, 어노테이션 설정, JAVA 설정방식을 이용할 수 있다.

쉽게 말해 spring이라는 관리하는 객체들을 Bean이라 한다!


3. AOP의 지원

관점 지향 프로그래밍. (Aspect-Oriented-Programming)

결제 메소드를 만들었다고 하자. 결제하는 코드를 쓰고 싶은데 tranjection, log출력, 예외처리 이 3가지는 없어서는 안된다. 그런데 결제라는 로직을 놓고 봐서는 결제에 관련 된 코드만 있으면 우리가 더 쉽게 할 수 있을 것이다. => 다른거는 신경쓸 필요 없게끔 구현하는걸 AOP라고 한다. (결제에만 focus한다.)

메인로직과 메인로직은 아니지만 필요한 로직으로 나눈다.

tranjection, log출력, 예외처리 공통적인 애들을 따로 외부에서 지정해서 사용한다. 그러면 결제 할 때는 결제에만 포커스를 할 수 있게 된다.

좋은 개발환경에서는 개발자가 비지니스 로직에만 집중할 수 있게 한다.
스프링 프레임워크는 반복적인 코드를 제거해줌으로써 핵심 비지니스 로직에만
집중할 수 있는 방법을 제공한다.

횡단 관심사(cross-concern)

보안이나 로그, 트랜잭션, 예외처리와 같이 비지니스 로직은 아니지만, 반드시 처리가 필요한 부분을 횡단 관심사(cross-concern)이라고 한다.

스프링 프레임워크는 이러한 횡단 관심사를 분리해서 제작하는 것이 가능하고
횡단 관심사를 모듈로 분리하는 프로그래밍을 AOP라고 한다.

이를 통해서 3가지의 이점이 생긴다.

1) 핵심 비지니스 로직에만 집중하여 코드 개발
2) 각 프로젝트마다 다른 관심사 적용 시 코드 수정 최소화
3) 원하는 관심사의 유지보수가 수월한 코드 구성 가능

종단관심사인 메인로직에 더 맞춰서 개발할 수 있는 환경을 조성하는 것을 AOP를 지원한다 라고 말한다.

4. 편리한 MVC 구조 : 트랜잭션의 지원

트랜잭션 : 작업의 단위

포인트 적립을 개발하기 위해서는 최소한 DB접근을 2번해야한다.
판매 : insert 포인트 정보수정 : update
insert성공하고 update를 실패했다면 우리가 직접 rollback해야하는데 spring은 알아서 해준다.
하나의 트랜잭션 중에서 하나가 문제가 생긴다면 바로 rollback 자동으로 지원해준다.

DB작업 시 트랜잭션관리를 매번 상황에 맞게 코드로 작성하지 않고,
어노테이션이나 XML로 트랜잭션 관리를 설정할 수 있다.

5. WAS의 종속적이지 않은 개발 환경 : 단위 테스트

jsp는 테스트하려면 화면까지 출력해야한다. => WAS에 종속적이다.

spring은 단위테스트를 할 수 있는 프로그램이 따로있다. 굳이 WAS = 서버를 돌리지 않아도 방금 만든 메소드를 바로 테스트 할 수 있다.
전체 Application을 실행하지 않아도 기능별 단위 테스트가 용이하기 때문에
버그를 줄이고 개발 시간을 단축할 수 있다.

profile
Software Developer : -)

0개의 댓글