회사 첫 출근 - 구조 파악하기

Nerd_Lee·2022년 4월 1일
0

study

목록 보기
1/3

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가지

      1. ComponentScan 어노테이션을 활용하기
      • ComponentScan이란, @Component 어노테이션 및 streotype 어노테이션 (@Service, @Repository, @Controller) 등 어노테이션이 부여된 Class들을 자동으로 Scan하여 Bean으로 등록해준다.

      1. Bean 설정파일에 직접 빈 등록하기
      • 직접 Bean을 등록하기 위해서는 @configuraton@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 구조

  1. 사용자가 Server에 특정 URL을 요청했을 때 해당 URL이 인증이 필요할 경우 Server는 로그인 페이지를 return하게 됩니다.

  2. 사용자가 id와 password를 입력하고 로그인 버튼을 클릭하면, 해당 데이터가 서버에 전송된다.

  3. 서버는 해당 로그인 정보를 확인하고 해당 유저 정보가 존재한다면 Session과 Token을 생성하고 저장한다.

  4. 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();							// 인증을 받지 않아도 누구나 접근 가능하게 하는 함수
}
profile
게임프로그래밍 2년 / 웹 개발 신입

0개의 댓글