본문 바로가기
Spring 프레임워크/이론

Spring MVC 패턴의 구조 파악 (Model 파트)

by Hwanii_ 2023. 8. 2.
728x90

1.

Controller 파트에서 Service 레이어가 관념적으로 존재 한다.

XxxServiceImpl 은 Service 레이어를 구현한 클래스 이다.

정석적인 개념은 아니고, 이해를 위해 정리.

Impl은 Implements를 의미 한다.

("무언가의 개념을 해당 클래스에서 구현 했다" 라는 의미)

 

Service 레이어 :

DAO를 사용하는 "주체" 가 되는 공간.

 

즉, DAO를 열심히 사용 하기 때문에, Controller 파트 이다.

 

이때, Controller 가 DAO를 열심히 사용 하기 위해서,

DAO의 메서드 시그니쳐를 잘 맞춰서 사용 하면 좋다.

 

맞춘다 ? 

메서드 시그니쳐를 강제한다 ?

>> XxxService 인터페이스를 생성 해서, 그 인터페이스를 구현 하기 !

 

2.

C에서 M의 DAO와 VO를 사용할텐데,

이때, DAO의 비즈니스 메서드의 메서드 시그니쳐를 통일하면 서로가 좋다.

 

/*

비즈니스 메서드 
비즈니스 로직 
핵심 관심 (concern) 
핵심 로직 
핵심 메서드 
CRUD

*/
모두 같은 의미 이다.

 

 

위의 이미지 처럼, XxxService 인터페이스를 작성 한다.

 

비즈니스 메서드의 input, output, 메서드명을 모두 정해준다.

 

3.

위의 BoardService 인터페이스를 구현한 클래스

>> BoardServiceImpl

 

 

 

이렇게 인터페이스의 미완성 메서드들이 구현된 모습을 확인 할 수 있다.

 

이때,

인터페이스를 구현한 이 클래스에서, 여러가지의 비즈니스 메서드를 사용 하기 위해서,

private BoardDAO boardDAO 라는 멤버변수가 필요 하다.

그래서 꼭 필요하니까, 둘은 의존 관계 의 개념이고,

결국, 의존 주입을 해줘야 한다.

 

 

원래 라면 ~ @Autowired 어노테이션이 작성된 멤버는

메모리에 올라와 있어야, 의존관계로 설정 해주기 때문에,

객체화를 해야 하는데,

이 객체화는 .xml 파일에서,

<bean> 태그를 사용해서 해줬었다.

 

근데, 이 BoardDAO 자료형을 지정한 패키지 범위 내에서,

이미, 어노테이션을 통해 객체화가 됬다면 !

<bean> 태그를 사용할 필요가 없어 진다.

 

이때는, 이미 메모리에 해당 자료형의 객체가 올라와 있기 때문에 == 객체화

그냥 @Autowired 어노테이션을 사용 하면 된다.

 

BoardDAO 클래스 내부를 확인 하면 아래와 같다.

 

 

이렇게 @Repository("boardDAO") 어노테이션 으로,

객체화를 해주세요 ~ 라고 작성 되어 있는 모습을 확인 할 수 있다.

 

근데, 이걸 작성하는 이유는 무엇일까 ?

 

4.

@Repository 어노테이션

 

@Repository 어노테이션은 @Component를 "상속" 받은 어노테이션 이다.

 

스프링 컨테이너는 @Repository 어노테이션을 "Model 파트에서 "객체화" 하는거구나 ?"

라고 자동으로 인지 한다.

 

그래서 스프링 컨테이너가 메모리를 관리하기에 유리 해진다.

>> 속도 향상.

 

즉,

1) 스프링 컨테이너가 메모리를 관리하기 좋게 ~

2) 이곳이 Model 파트 라는것을 한눈에 알기 쉽게 하기 위해 ~ (가독성)

 

그래서, @Repository 어노테이션을 사용 하는 것이다.

 

 

여기서 boardDAO 라는 참조변수를 객체화 해주기 때문에,

다른곳에서 의존 주입을 위해 사용된 @AutoWired 이 걸려있는 멤버를,

.xml 에서 <bean class = "패키지명.자료형" id ="객체명"> 을 안해줘도 된다 !

 

5.

 

 

@Component를 "상속" 받은 어노테이션으로

@Repository 어노테이션 외에,

@Service 어노테이션 도 존재 한다.

 

스프링 컨테이너는 @Service 어노테이션을 "Controller 파트에서 "객체화" 하는거구나 ?"

라고 자동으로 인지 한다.

 

그래서, 아 해당 클래스는 Controller 파트 이구나 ~ 라는것을 알기 쉽게

@Service 어노테이션 을 사용 한다.

 

자바에서 어노테이션을 사용 하기 위해서는,

 

.xml 파일 내부에, 아래와 같이 코드를 작성 하면 된다.

 

 

 

com.spring 폴더 하위에 있는 모든 폴더를 대상으로 범위 지정 해서,

객체화 할 대상을 (자료형) 스캔 하겠다는 의미.

 

.xml 파일 생성 방법

 

 

이곳에,

 

 

 

6.

 

 

MySQL 과 다르게, 오라클은 PK에 Auto_increment (자동증가) 를 걸 수 없다.

 

그래서 서브쿼리로 해결 한다.

 

((SELECT (MAX(BID) + 1 FROM BOARD)

>> 가장 큰 값에 + 1을 해줘 ~

 

근데, 게시글이 없으면 ? 에러가 발생 하기 때문에 ~ 아래와 같이 작성 해야 한다.

 

(SELECT NVL(MAX(BID),0)

NVL >> 만약에 MAX 값이 없다면, 0으로 대체해줘 ~ 라는 함수 이다.

 

1000번 부터 시작 하고 싶으면 ,1000 으로 하면 된다.

반응형