20230510 오늘의정리
De-facto '실제로 있지만 반드시 법에 의해 제정된 것음 아님'
사실상의 표준, 국제 표준기구나 법적으로 선언한것은 아니지만 실제 존재하는 관행을 설명합니다.
전통, 시행 또는 시장 지배력에 의해 지배적인 위치를 달성한 표준(공식 또는 비공식)입니다.
예시 > 개발환경 셋팅을할때 인코딩설정을 'UTF-8'로한다. 한글깨짐을 막기인한 강제되는 의무
CoC (Covention over Configuration)'구성에대한 규칙' or '규칙에 의한 코딩'
소프트웨어 개발자가 정해야 하는 수많은 결정들을 줄여주고 단순성을 확보하면서도 유연함을 잃지 않기위한 소프트웨어 디자인 패러다임 입니다.
프레임워크가 복잡해지고 기능이 방대해짐에 따라 사용하기위해서 수많은 설정파일과 세팅(XML)
을 해야하는 부담이 생겨났습니다. CoC는 구성에대한 규칙을 정하여 코드를 생략하고 규칙에따르지않는 경우에만 개발자가 정의할수있도록 하고있습니다. CoC는 이렇게 많은 설정 파일을 관리하고 세팅을 해주어야 하는 부담에서 벗어나게해주고 소프트웨어개발에 집중할수있게 해주는 훌륭한 패러다임입니다만 프레임워크가 지원하는 관례를 숙지하면서 프레임워크를 사용해야합니다.
현재 최신의 Spring Framework(2.x버전 이후) 대에서는 CoC패러다임을 채용함으로써 수많은 설정,셋팅등을 생략시켜 좀더 쉽게 개발할수있게 되었습니다. 이러한 공통적인관례를 따르지않는다면? 프레임워크가 지원하였던 규칙을 스스로 정의해야합니다😱😱
Spring Framework
자바플랫폼을 위한 오픈소스 애플리케이션 프레임워크로 간단하게 Spring이라고도 한다. 동적인 웹사이트를 개발하기 위한 여러가지 서비스를 제공하고있다.
- 경량컨테이너로서 자바객체를 직접 관리한다. 객체의 라이프사이클을관리하며 스프링으로부터 필요한 객체를 얻어올수있다.
-스프링은 제어반전 (IoC)를 지원한다. 컨트롤의 DI제어권이 개발자가 아니라 프레임워크에서 제어한다.
- 스프링은 의존성주입(DI)를 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
- 스프링은 AOP를 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러모듈에서 공통적으로 사용하는 기능의 경우 해당기능을 분리하여 관리할수있다.
- 스프링은 데이터엑세스를 지원한다 iBATIS나 하이버네이트등 이미 완성도가 높은 데이터베이스처리 라이브러리와 연결할수있는 인터페이스를 제공한다.
DI(Dependency Injection)
의존성주입이라는 뜻입니다. Spring은 개발자에게 @Autowired라는 annotaion을 제공합니다 이 annotation만 입력한다면 Spring이 개발자대신 의존성주입 결정을 대신해줍니다.
의존성을 주입하는 방법은 Filed Injection, Setter Injection, Constructor Injection 3가지방법이 있습니다.
Filed Injection - 필드를 생성한 코드위에 @Autowired를 입력합니다.
*하지만 검색해보니 Field 에 바로 의존성을 부여하는것은 안하는게 좋다고합니다. 그 이유는 필드에 의존성을 부여하면 다른 의존성을 부여할수없습니다 즉 결합도 느슨한것이아니라 강하게된다는 이야기입니다. 그리고 순환참조될수있다는데 순환참조는 다시공부해보겠습니다*
Setter Injection - 필드의 Setter Method위에 @Autowired를 입력합니다.
Constructor Inejction - 클래스의 생성자에 @Autowired를 입력합니다.
*스프링이 권장하는 의존성주입이라고합니다*
public Class Gogo {
//Field Injection
@Autowired
private GoService goService;
//Setter Injection
@Autowired
public void setGoService(){
this.goService = goService;
}
//Constructor Injection
@Autowired
public void Gogo(GoService goService){
this.goService = goService;
}
}
- 여기서 제가 잘못알게된 지식은 그동안 모르고 사용했던 @Resource라는 annotation은 스프링이 지원해주는 annotation이 아닌 java에서 지원해주는 annotaion이였다. 라는것입니다. Resource는 이름 -> 타입 -> Qualifier 순으로 의존성을 주입한다고합니다. 그러면 spring이 기껏 지원해준 @Autowired가 아닌 @Resource annotaion을 쓰는 이유가 뭘까요, 컴포넌트들의 value attribute를 찾아서 의존성을 주입할 객체를 바로 찾을수있다는 장점이있습니다. 그래서 사용하는것같습니다. 전에 학원수업을 정리해서 쓴거와같이 @Autowired는 타입 -> 이름 -> Qualifier 순으로 의존성을 주입할 객체를 찾습니다. 만약 annotation을 입력한 타입이 여러개가있다면 Exception이 발생할것입니다.
#Reference
CoC
https://jangsunjin.tistory.com/241
https://en.wikipedia.org/wiki/Convention_over_configuration#cite_note-1
https://jangsunjin.tistory.com/241