📑
Annotation
Annotation은 프로그램 내에서 주석과 유사하게, 프로그래밍 언어에는 영향을 미치지 않으면서 프로그램/프로그래머에게 유의미한 정보를 제공하는 역할을 한다.
표준 어노테이션
Annotation | 쓰임 |
@Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다. 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.(오탈자가 있다면 컴파일 에러를 발생시켜 문제를 막는다.) |
@Deprecated | 앞으로 사용하지 말 것을 권장하는 대상에 붙인다. 에러는 아니지만 알림 메세지가 출력된다. |
@SuppressWarnings | 컴파일러의 특정 경고메세지가 나타나지 않게 해준다. |
@SafeVarargs | 제너릭 타입의 가변인자에 사용한다.(JDK 1.7) |
@FunctionalInterface | 함수형 인터페이스라는 것을 알린다. (JDK 1.8) 함수형 인터페이스의 제약사항이 지켜져 있는지 확인한다. |
@Native | native 메서드에서 참조되는 상수 앞에 붙인다. (JDK 1.8) |
@Target | 애노테이션이 적용가능한 대상을 지정하는데 사용한다. 타입(클래스, 인터페이스, enum), 필드, 메서드, 생성자, 인스턴스 변수에 사용할 수 있다. |
@Documented | 애노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. 자동으로 html 문서 생성. |
@Inherited | 애노테이션이 자손 클래스까지 상속되도록 한다. |
@Retention | 애노테이션이 유지되는 범위를 지정하는데 사용한다. (어노테이션 유지 정책 결정) |
@Repeatable | 애노테이션을 반복해서 적용할 수 있게 한다. (JDK 1.8) |
위의 다섯 개는 메타 어노테이션: 어노테이션을 만들 때 사용하는 어노테이션
MVC Pattern
Model - Data
View - UI
Controller - Brain(Processing)
Java Spring 프로젝트에서의 MVC패턴은 다음과 같이 세 개의 Layer로 구성된다.
● Controller
클라이언트에서 요청이 들어올 때 해당 요청을 수행할 화면이나 비즈니스 로직을 제어하는 객체.
실제로 서비스 수행은 Model영역에서 수행된다.
@Controller 어노테이션 사용
● Service
컨트롤러에서 ServiceImpl 객체를 생성한 뒤 호출.
서비스레이어(비즈니스 레이어)에서 세분화 된 비즈니스 로직을 제어하는 객체.
@Sevice 어노테이션 사용
● DAO(Data Access Object)
Service에서 DAO객체를 생성한 뒤 호출.
sqlsession 객체를 통해 전달받은 파라미터로 DB 처리.
@Repository 어노테이션 사용
● DTO(Data Transfer Object)
계층(Layer) 간 데이터를 전달하기 위한 객체.
오직 getter/setter 메서드만을 가진다.
순수한 데이터 객체로 비즈니스 로직을 갖지 않는다.
● VO(Value Object)
주고받는 데이터 객체의 구조 결정.(알지 못하는 데이터가 들어오지 못하게 함.)
계층 간의 데이터 교환을 위한 객체.
멤버변수와 그에 해당하는 getter 메서드만 존재.(Read Only)
DB의 테이블 요소들을 모두 포함해야 함.
비즈니스 로직을 포함할 수 있다.
Proxy 디자인 패턴의 사용
서비스 레이어(비지니스 레이어)에서 Service 인터페이스를 상속해서 객체를 생성하여 서비스를 실행하는 것 - 프록시 패턴.
프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다.
이렇게 중계 대리자를 통해 이용하는 방식을 취하는 이유
- 보안(Security) : 프록시는 클라이언트가 작업을 수행할 수 있는 권한이 있는지 확인하고 검사 결과가 긍정적인 경우에만 요청을 대상으로 전달한다.
- 캐싱(Caching) : 프록시가 내부 캐시를 유지하여 데이터가 캐시에 아직 존재하지 않는 경우에만 대상에서 작업이 실행되도록 한다.
- 데이터 유효성 검사(Data validation) : 프록시가 입력을 대상으로 전달하기 전에 유효성을 검사한다.
- 지연 초기화(Lazy initialization) : 대상의 생성 비용이 비싸다면 프록시는 그것을 필요로 할때까지 연기할 수 있다.
- 로깅(Logging) : 프록시는 메소드 호출과 상대 매개 변수를 인터셉트하고 이를 기록한다.
- 원격 객체(Remote objects) : 프록시는 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다.
추가로..
인터페이스를 사용하는 이유
1. 객체 간의 결합도를 낮추기 위함.
2. 인터페이스와 구현체가 분리되어 구현체의 확장성이 높아지고 응집성이 낮아진다.
3. 추상화를 함으로써 Solid 5원칙 중 하나인 OCP(확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다) 원칙이 실현된다.
4. 다형성을 위함.
MyBatis
- 동적 쿼리 작성이 가능한 JAVA Persistance Framework의 하나이다.
- DB 쿼리와 프로그래밍 언어를 분리해 유지보수성과 생산성을 높였다.
- 캐시 기능을 제공해 연산속도가 빨라 성능이 향상된다.
사용법
의존성 설정 - DB 설정 - MyBatis 설정 - Mapper Interface 작성 - XML 작성 - MyBatis 사용
클라이언트의 요청을 받고 응답하는 과정
- 클라이언트가 웹 브라우저를 통해 요청(request)
- 요청을 받은 DispatcherServlet이 HandlerMapping을 통해 해당 요청을 처리한 Controller를 찾음
- 찾은 컨트롤러는 ServiceImpl를 호출하고 필요한 데이터를 요청.
- ServiceImpl는 DAO를 호출해 DB에서 필요한 데이터를 가져옴.
- 가져온 데이터를 VO 객체로 매핑.
- ServiceImpl는 컨트롤러로 반환할 데이터를 VO 객체로 만들어 반환.
- 컨트롤러는 받은 VO 객체를 view에 전달하기 위해 ModelAndView객체에 담아 반환.
- DispatcherServlet은 반환된 ModelAndView객체를 ViewResolver를 통해 실제 view로 변환.
- 변환된 view는 HttpServletResponse객체에 쓰여 클라이언트에게 응답됨.
*Servlet: 자바 웹 애플리케이션에서 동적 처리를 수행하기 위한 자바 클래스. Http 요청과 응답 프로토콜을 다루기 위한 API를 제공한다. 스프링 프레임워크는 서블릿을 기반으로 구현되어 있어 별도로 서블릿을 선언할 필요 없이 자동으로 서블릿을 생성, 관리한다.