📌Spring Framework 특징
의존성이란(Dependency)?
📍ex. 셰프 클래스, 레스토랑 클래스가 있다고 한다면 셰프는 레스토랑에서만 쓰이는 것이 아니다, 레스토랑에는 반드시 셰프가 필요 하다.
▶️ 즉 두 객체간에 의존성(레스토랑이 셰프 한테 의존 한다. -> 레스토랑 클래스 안에는 셰프라는 객체가 존재한다. -> 의존성이 강하다 -> 유연한 개발이 힘들다 -> 의존성 주입 필요
📍ex. 칼, 요리라는 두 객체가 존재
▶️칼은 요리 없이 사용 가능하다. 요리외에 다른 용도로 사용하면 된다.
▶️반면 요리는 칼 없이 안된다, 칼이 있어야 요리가 가능 하다.
-> 요리가 칼 한테 의지 하고 의존한다.
-> 요리 안에 칼이 있다
-> 의존성 관계가 단단하다.
->칼에는 여러 종류가 들어가야 하는데 이렇게 단단한 결합일 경우 한 종류의 칼만 정의 할 수 있다.
-> 주입이라는 기술을 사용하서 결합도를 느슨하게 해야한다.
➡️의존성 이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미
(A객체가 B객체 없이 동작이 불가능한 상황을 'A'가 'B에 의존저깅라고 표현 한다.')
주입이란(Injection)?
📍말 그대로 외부에서 밀어 넣는 것을 의미
-(내 필드안에서 new를 하는 것이 아니라 다른 필드 에서 new를 해서 주입 하는 것)
-(ex. 어떤 객체가 필요한 객체를 외부에서 밀어 넣는 것을 의미한다.)
-(ex. a, b, c라는 객체가 있으면 c가 a라는 객체가 필요하다고 하면 b가 a를 가지고 c에 가져다 주는 것이 주입이다.)
📍주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없고 어떤 객체에 의존하든 자신의 역할은 변하지 않게 된다.
(b가 알아서 해주기 때문에 신경쓸 필요가 없다, 외부에서 주입을 받기 때문에 자신의 역할이 변하지 않는다.)
🔎정리
➡️의존 : a객체 에서 b객체를 직접 생성(결합성이 단단해 진다.)
➡️의존성 주입 : a -> ❓ <-> b (a는 b가 필요하다는 신호만 보내고, b객체를 주입하는 것은 외부에서 이루어 진다.)
➡️의존성 주입 방식을 사용하기 위해서는 ❓라는 존재가 필요하게 된다.
📍스프링 프레임워크 에서는 ApplicationContenxt가 ❓라는 역할을 하며, 필요한 객체들을 생성하고, 필요한 객체들을 주입해주는 역할을 한다.
-(사용자가 어노테이션을 사용하면 ApplicationContext가 필요한 것을 주입해준다.)
➡️따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고, 이러한 객체들을 엮는 wiring작업의 형태로 개발하게 된다.
(ApplicationContext(Spring)이 괸리하는 객체들을 빈(Bean)이라고 한다. 빈과 빈 사이의 관계를 처리하는 방식으로는 XML방식, 어노테이션 설정, JAVA 설정 방식(비교적 복잡하다.)을 이용할 수 있다.)
AOP(Aspect-Oriented-Programming)지원
📍관점지향 언어(프로그래밍)
-ex. 결제라는 메소드를 만들때 log출력(오류보기), transaction(DBMS, DB조회), 예외처리 이러한 3가지는 없어서는 안되는 기능 들이다.
▶️ 결제라는 로직을 봤을때는 결제와 관련된 기능을 보는 것이 개발할때 더 좋겠다는 생각
(메인 로직에 집중하는 것이 관점)
➡️즉 다른 것을 신경쓸 필요 없게 하나의 관점만 신경 쓰도록 개발하는 것이 AOP이다.
📍메인로직(종단 관심사)과 메인로직은 아니지만 필요한 로직(횡단 관심사)을 외부에 분리 한다.
📍좋은 개발환경에서는 개발자가 비지니스 로직에만 집중할 수 있게 한다.
📍Spring Framework는 반복적인 코드를 제거해줌으로써 핵심 비지니스 로직에만 집중할 수 있는 방법을 제공한다.
📍보안이나 로그, 트랜잭션, 예외처리와 같은 비지니스 로직은 아니지만 반드시 필요한 부분을 횡단관심사(cross-concern)이라고 한다.
📍스프링 프레임워크는 이러한 횡단관심사를 분리해서 제작하는 것이 가능하고 횐단 관심사를 모듈로 분리하는 프로그래밍을 AOP라고 한다.
📍장점
1. 핵심 비지니스 로직에만 집중하여 코드 개발
2. 각 프로젝트마다 다른 관심사 적용 시 코드 수정 최소화
3. 원하는 관심사의 유지보수가 수월한 코드 구성 가능
트랜잭션(작업의 단위)의 지원
📍ex. 포인트 적립이라는 서비스를 개발하기 위해 DB에 최소 2번의 접근의 필요
(1. 판매시 insert 2. 수정 update --> 트랜젝션 두개)
📍트랜젝션을 지원한다는 의미는 insert는 성공했는데 update를 실패한 경우 직접 롤백을 해야하는데 spring에서는 자동으로 롤백이 된다.
(여러개의 트랜젝션 중 하나만 실패 해도 롤백이 된다.)
📍DB작업 시 트랜잭션관리를 매번 상황에 맞게 코드로 작성하지 않고, 어노테이션이나 XML로 트랜잭션 관리를 설정 가능하 다.
단위 테스트
📍단위 테스트를 할 수 있는 서버가 따로 있다.
📍전체 Application을 실행하지 않아도 기능별 단위 테스트가 용이하기 때문에 버그를 줄이고 개발 시간을 단출할 수 있다.
편리한 MVC 구조
📍WAS의 종속적이지 않은 개발 환경(WAS에 종속적이다는 것은 실행 시켜서 톰캣이 실행되서 결과가 나올때꺼까지 기다리는 것)
📍스프링은 was가 없어도 테스트가 가능하다.