java annotation은 자바로 작성한 코드에 추가하는 표식
보통@
기호를 사용(JDK 1.5↑)
자바의 대표적인 애너테이션
annotation | 설명 |
---|---|
@Override | 선언된 메서드가 오버라이드 |
@Deprecated | 더 이상 사용되지 않음 |
@SuppressWarnings | 컴파일 경고를 무시 |
@Override를 이해해보자.
이 애너테이션은 메서드를 재정의함을 의미한다. 메서드를 재정의하면 부모 클래스의 메서드를 자식 클래스에서 다시 구현한다.
즉, @Override 애너테이션을 붙임으로써 다시 구현한 메서드임을 명시적으로 나타낸 것이다.
🔽 오버라이드 사용 예
public class B {
public void print() {
System.out.println("Hello from B");
}
}
public class A extends B {
@Override
public void print() {
System.out.println("Hello from A");
}
}
A 클래스에서 print() 메서드를 오버라이드했기 때문에,
A 클래스의 객체를 생성하고 print() 메서드를 호출하면
Hello from A
가 출력된다.
이렇게 오버라이드된 메서드는 부모 클래스인 B 클래스의 동일한 이름의 메서드를 가려서 호출된다.
A a = new A();
a.print(); // "Hello from A" 출력
"Hello from A"가 출력됩니다.
만약 A 클래스에서 print() 메서드를 오버라이드하지 않았다면,
B 클래스의 print() 메서드가 그대로 상속되어 실행되며
Hello from B
가 출력된다.
🔨구성의 차이
스프링
은 애플리케이션 개발 환경
을 수동으로 구성
하고 정의한다. 스프링부트
는 스프링 코어와 스프링 MVC의 모든 기능을 자동
으로 불러오므로 수동으로 개발 환경을 구성
할 필요가 없다.🔨내장 WAS의 유무
jar 파일
만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션을 실행할 수 있다. 또한 스프링부트의 내장 WAS에는 톰캣, 제티, 언더토우가 있어서 상황에 필요한 WAS를 선택할 수 있다.스프링의 모든 기능의 기반을 제어의 역전(IoC)과 의존성 주입(DI)에 있다.
IoC란 ?
🔽 스프링 컨테이너가 객체를 관리하는 방식 예
public class A {
//코드에서 B 객체를 생성하지 않고 어디선가 받아온 객체를 b에 할당
private B b;
}
DI란 ?
DI는 어떤 클래스가 다른 클래스에 의존하는 것인데 코드로 이해하기 전에
@Autowired
라는 애너테이션을 사용한다.
@Autowired
애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할인데 빈은 스프링 컨테이너에서 관리하는 객체를 말한다. IoC 코드에서는 개발자가 직접 B 객체를 생성했지만 다음 코드는 어딘가에서B b;
라고 선언했을 뿐 직접 객체를 생성하지는않고 있다.다시말해 객체를 주입받고 있다.
🔽 객체를 주입받는 모습 예
public class A {
// A에서 B를 주입받음
@Autowired
B b;
}
실행하면 문제없이 작동되는데 그 이유로 스프링 컨테이너라는 곳에서 객체를 주입했기 때문이다. 즉, 스프링 컨테이너가 B 객체를 만들어서 클래스 A에 B 객체를 주입
이IoC/DI
개념이 스프링 핵심개념
스프링 컨테이너란 ?
- 스프링 컨테이너는 빈을 생성하고 관리한다.
즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리하는 것. 또한 개발자가Autowired
같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 한다. 그렇다면 빈은 무엇일까 ?
빈(Bean) ? -> 스프링의 객체 !
- 조금 전의
🔽 객체를 주입받는 모습 예
의 코드에서 B가 바로 빈이다. 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공하는데, 이 말은 빈을 등로가는 방법도 여러가지라는 뜻이다.
예로 MyBean이라는 이름의 클래스에@Component
애너테이션을 붙이면 MyBean 클래스가 빈으로 등록된다.
이후 스프링 컨테이너에서 이 클래스를 관리한다.
이때 빈의 이름은 클래스의 첫 글자를 소문자로 바꿔 관리한다.MyBean
→myBean
🔽 클래스를 빈으로 등록 예
@Component
public class MyBean {
...
}
AOP는 Aspect Oriented Programming으로 직역하면 관점 지향 프로그래밍이다.
프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미한다.
계좌이체 프로그램을 예로 들면
관점 | 계좌이체 프로그램 |
---|---|
핵심 관점 | 계좌이체 |
부가 관점 | 로깅, 데이터베이스 연결 |
AOP 관점을 적용하면 부가 관점에 해당하는 로직을 모듈화해 개발할 수 있게 해준다. 즉, 부가 관점 코들르 핵심 관점 코드에서 분리할 수 있게 해준다. 이렇게하면 개발자는 핵심 관점 코드에만 집중할 수 있게 될 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있다.
PSA는 Portable Service Abstraction으로 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 의미한다.
대표적인 PSA의 예는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이 있다. 예로 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 등이 있는데, 이 기술 중 어떤 것을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다.
또다른 예시로는 WAS도 PSA의 예시 중 하나로 볼 수 있는데, 코드는 그대로 두고 WAS를 톰캣이 아닌 제티, 언더토우와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있다.
스프링 프레임워크는 IoC/DI로 객체들의 관계를 설정하고, APO로 핵심 기능과 부가 기능을 분리하여 개발하며, PSA로 서비스들을 통일된 방식으로 사용할 수 있게 한다.