회사 첫 출근 - 구조 파악하기
안녕하세요. Nerd-Lee입니다. 첫 웹 개발 실무를 위해 현재 회사에 입사해서 프로젝트를 보면서
Spring MVC 패턴에 대한 내용들과, mybatis에 관련되서 궁금했던 내용들을 정리해봤습니다.
도움이 되신 분들이 있으셨으면 좋겠네요ㅠㅠ
1. MVC 패턴이란?
-
디자인 패턴 중 하나로써, Model, View, Controller의 약자이며 하나의 애플리케이션 또는 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴.
-
사용자가 컨트롤러를 조작하면 컨트롤러는 모델을 통해서 데이터를 가져오고, 가져온 데이트를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달한다.
-
간단하게 표현하자면 User -> Controller -> Model -> Controller -> View -> User
- Model이란?
- 애플리케이션의 정보, 데이터를 나타낸다. 데이터베이스, 정의하는 상수, 초기화값, 변수 등을 뜻한다. 또한 이러한 데이터를 가지고 가공을 책임지는 컴포넌트.
- View란?
- 사용자 인터페이스 요소를 나타낸다. Model에서 가공해준 데이터를 바탕으로 사용자들에게 보여주거나, 사용자가 입력한 내용을 바탕을, Controller에게 넘겨주는 역할을 한다.
- Controller란?
- 데이터와 사용자 인터페이스 요소들을 잇는 다리역할을 한다. 즉, 사용자가 데이터를 클릭하고 수정하는 것에 대한 이벤트들을 처리하는 부분.
2. DAO(Data Access Object)란?
- DAO는 DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.
3. DTO(Data Transfer Object)란?
- DTO는, VO(Value Object)로 바꿔 말할수도 있다. 하지만, DTO와 VO의 가장 큰 차이점은, VO는 read only 즉 읽기 전용으로만 사용이 가능하다. 계층간의 데이터 교환을 위한 오브젝트로 대표적으로는, 폼데이터빈, 데이터베이스 테이블빈 등이 있다.
4. 그럼 Bean은 또 무엇인가?
-
Spring IOC 컨테이너가 관리하는 자바 객체를 Bean이라고 부른다. 하지만, 스프링에서 Bean은 new 키워드를 이용해서 객체를 생성하는 것이 아닌 Spring에 의해 관리당하는 자바 객체를 Bean이라고 부른다고 한다.
-
Spring Bean을 등록하는 방법에 대한 2가지
-
- ComponentScan 어노테이션을 활용하기
- ComponentScan이란,
@Component
어노테이션 및 streotype 어노테이션(@Service, @Repository, @Controller)
등 어노테이션이 부여된 Class들을 자동으로 Scan하여 Bean으로 등록해준다.
- ComponentScan이란,
- ComponentScan 어노테이션을 활용하기
-
- Bean 설정파일에 직접 빈 등록하기
- 직접 Bean을 등록하기 위해서는
@configuraton
및@Bean
어노테이션을 사용하면 된다. - 라이브러리 혹은 내장 클래스 등의 개발자가 직접 제어 불가능한 클래스의 경우 직접 Bean을 등록해서 사용하면 된다고 한다.
- 직접 Bean을 등록하기 위해서는
- Bean 설정파일에 직접 빈 등록하기
-
5. Mybatis
- Mybatis란?
- Mybatis는 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있도록 도와주는 개발 framework로써, JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고, 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성해 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.
- 특징
- 복잡한 쿼리나 다이나믹한 쿼리에 강하지만, 비슷한 쿼리는 남발하게 되는 단점이 존재한다고 하며, 프로그램 코드와 SQL 쿼리의 분리로 인해 코드의 간결성 및 유지보수성이 향상된다고 한다.
6. Mybatis <sql>
, <include>
, <property>
태그
<sql>
은 반복적으로 사용하는 쿼리를 재사용하기 위한 SQL 조각입니다.- id 속성값이 필수이며, 사용하려는 태그보다 먼저
<sql>
태그가 선언되어 있어야 합니다.
<sql id="test">
from ${testQuery}
</sql>
- 위와 같은 sql 태그가 있다면,
<include>
와<property>
태그는 다음과 같이 사용이 가능하다.
<include refid="test">
<property name="testQuery" value="hello" />
</include>
- test라는 id를 가지고 있는, sql 태그를 찾아서, 해당 쿼리를 사용하게 되고 property 태그는, 만약 sql 태그에 ${값} 이 있다면 사용을 한다. 위 코드를 해석하면 다음과 같다.
from hello
물론 이 자체로는 의미없는 쿼리가 되지만, 만약 from, where 절을 여러번 사용할 경우가 생긴다면<sql>
태그에 자주 사용하는 쿼리를 만들어서 넣어놓으면 가독성이 좋아질 것이다.
7. Mybatis 각 태그 사용법
-
각 절에 맞는 태그들이 있다. 대표적으로는
<insert>
,<select>
,<update>
,<delete>
가 있는데, 아직 테스트 해보지는 못했지만 가독성을 위한 태그로 보여진다. 각 태그에 맞는 쿼리를 만들어서 사용하면 될 것 같다. -
각 태그에는 id와 resultType과 같은 속성이 있는데 id는,
<mapper>
태그의 namespace 속성에 있는 java 클래스의 메서드를 참조하거나 아니면 해당 id를 가지고 쿼리를 실행할 수 있는 것 같다. 방법이 여러가지라 사용하기 나름이라고 생각이 들고, resultType은 return되는 자료형을 뜻하는 것 같다. -
또한 메서드를 참조할 경우, 해당 메서드에 매개변수가 있다면 매개변수를
#{매개변수 이름}
으로 사용할 수도 있다.
8. @PostConstruct란?
-
@PostConstruct
어노테이션은, 의존성 주입이 이루어진 후 초기화를 수행하는 메서드라고 하며,@PostConstruct
가 붙은 메서드는 클래스가 service를 수행하기 전에 발생.@PostConstruct
가 붙은 메서드는 초기화를 수행하는 메서드라면, 반대로 종료 작업을 수행하는 메서드에는@PreDestroy
를 사용한다. -
장점은, 생성자가 호출 될 때, bean은 초기화가 되지 않지만,
@PostConstruct
를 사용한 생성자는 bean이 초기화 됨에 따라 동시에 의존성을 확인할 수 있고, bean lifecycle에서 오직 한 번만 수행되기 때문에,@PostConstruct
를 사용하면 여러 번 초기화되는 것을 방지할 수 있다고 한다. -
유일한 단점으로는, 외부 라이브러리에 적용하지 못한다는 것이고, 외부 라이브러리 초기화 및 종료를 하기 위해서는
@Bean
의 initMethod / destroyMethod를 사용해야 한다.
9. Spring Security Form Login 구조
-
사용자가 Server에 특정 URL을 요청했을 때 해당 URL이 인증이 필요할 경우 Server는 로그인 페이지를 return하게 됩니다.
-
사용자가 id와 password를 입력하고 로그인 버튼을 클릭하면, 해당 데이터가 서버에 전송된다.
-
서버는 해당 로그인 정보를 확인하고 해당 유저 정보가 존재한다면 Session과 Token을 생성하고 저장한다.
-
WebSecurityConfig 클래스를 만들면,
WebSecurityConfigurerAdapter
클래스를 상속 받아야하는데,WebSecurityConfigurerAdapter
클래스는, 스프링에서 제공하는security
라는 라이브러리를 가지고 있어야 한다.
protected void configure(HttpSecurity http) throws Exception{
http.formLogin()
.loginPage("/login.html") // 사용자 정의, 로그인 페이지
.defaultSuccessUrl("/home") // 로그인을 성공하면 이동 할 페이지 경로
.failureUrl("/login.html?error=true") // 로그인 실패 후 이동 할 페이지 경로
.usernameParameter("username") // id input 태그의 name 속성 값
.passwordParameter("password") // password input 태그의 name 속성 값
.loginProcessingUrl("/login") // 로그인 Form Action url 경로
.successHandler(loginSuccessHandler()) // 로그인 성공 시 핸들러 호출
.failureHandler(failureHandler()) // 로그인 실패 시 핸들러 호출
.permitAll(); // 인증을 받지 않아도 누구나 접근 가능하게 하는 함수
}
다음 글로 찾아오겠습니다!