본문 바로가기
레거시

2022.02.24 의 기록

by GroovyArea 2022. 2. 24.

=>  공부 관련

1) 모던 자바 스트림(Stream) & 입출력 스트림(IO Stream)

2) 금일 배운 내용 복습

3) 스프링 객체지향 CH2

 

=> 파이널 프로젝트 관련

1) UI 회의


 문제 정리

1. 스트림 관련 정리

> 문제 : 스트림에서 Map(), flatMap()의 차이?

> 정리 : 스트림의 스트림을 반환하는 중간연산과 스트림을 반환하는 중간 연산. 스트림의 형태가 배열인 경우 flatMap이 유용


 공부 내용

Mybatis

mapper 엘리먼트

  • class 속성 : Interface 기반의 맵퍼 파일의 경로를 속성값으로 설정
  • ⇒ Interface & XML 파일의 경로는 Java 자료형으로 표현
  • Interface 맵퍼의 장점 : SqlSession 인스턴스로 SQL 명령을 XML 맵퍼보다 쉽게 제공받아 사용하기 편리
  • Interface 맵퍼의 단점 : 매핑 설정 기능과 동적 SLQ 기능을 구현하기 불편

⇒ XML 맵퍼의 장점 : 매핑 설정 기능(수동 매핑)과 동적 SQL 기능을 구현하기 편리

⇒ XML 맵퍼의 단점 : SqlSession 인스턴스로 SQL 명령을 제공받아 사용하기 불편, DAO 만들기 불편 (각각의 명령에 맞는 쿼리문을 호출해야함)

XML 맵퍼 파일과 Interface 맵퍼 파일을 하나의 냅퍼로 동작되도록 설정하여 사용 - 맵퍼 바인딩(Mapper Binding)

⇒ SQL 명령은 XML 맵퍼에 등록하고 DAO 클래스는 Interface 맵퍼를 이용해서 작성

  • mapper 엘리먼트에는 XML 맵퍼 파일만 등록하여 설정

XML 맵퍼 파일과 Interface 맵퍼 파일을 하나의 맵퍼로 동작되도록 설정하는 방법

  • ⇒ XML 맵퍼의 mapper 엘리먼트의 namespace 속성값으로 같은 이름의 Interface 맵퍼 파일을 작성
  • ⇒ XML 맵퍼에서 SQL 명령이 등록된 엘리먼트와 Interface 맵퍼의 추상 메서드가 동일한 형태로 작성 → DAO 클래스에서 추상메서드를 호출한 경우 같은 이름의 엘리먼트의 SQL 명령을 제공받아 사용
  • 일반적으로 parameterType 속성값은 추상 메서드의 매개변수로 설정하고 resultType 속성값은 추상메서드의 반환형으로 설정
  • ⇒ 맵퍼 바인딩한 경우 엘리먼트의 parameterType 속성은 생략 가능 (현업에서는 생략)

mapper 인터페이스

  • mybatis 프레임워크는 인터페이스를 이용하여 맵퍼 설정 가능
  • ⇒ 추상 메서드에 맵퍼 어노테이션 (Mapper Annotation)을 사용하여 SQL 명령 등록

@insert : INSERT 명령을 등록하기 위한 어노테이션

  • value 속성 : 추상메서드에 등록한 SQL 명령을 속성값으로 설정
  • ⇒ 어노테이션에 value 다른 속성이 없는 경우 속성값만 설정 가능

@update: UPDATE 명령을 등록하기 위한 어노테이션

@delete : DELETE 명령을 등록하기 위한 어노테이션

@select : SELECT 명령을 등록하기 위한 어노테이션

  • 문제점 : 검색행의 컬럼명과 DTO 클래스의 필드명이 모두 다르면 검색행의 컬럼값이 DTO 클래스의 필드에 하나도 저장되지 않아 DTO 인스턴스를 생성하여 제공하지 않고 NULL 제공
  • 해결 방안 1) : 검색행의 컬럼명을 DTO 클래스의 필드명과 같도록 검색한다.
  • ⇒ SELECT 명령에서 Column Alias 기능을 이용하여 검색대상에 별칭을 설정하여 검색 (SQL as 이용 별칭)
    • SQL 명령을 구성하는 일부분의 문장을 등록하기 위한 엘리먼트
    include
    • sql 엘리먼트에 등록된 SQL 문장을 SQL 명령에 포함하는 엘리먼트
    • refid 속성 : sql 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • sql
  • 해결 방안 2) : mybatis 환경설정파일에서 setting 엘리먼트를 이용하여 [mapUnderscoreToCamelCase] 이름으로 적용된 실행 관련 값을 [true]로 변경
  • ⇒ SQL 명령에서 사용된 스테이크 표기법의 식별자가 자동으로 카멜 표기법으로 변경되어 검색
  • resultMap 속성 : 매핑정보가 저장된 resultMap 엘리먼트의 식별자를 속성값으로 설정 - 수동 매핑 처리

resultMap

  • 검색행의 컬럼값을 클래스의 필드에 매핑되어 저장되도록 설정하는 상위 엘리먼트
  • type 속성 : 검색행의 컬럼값을 저장하기 위한 필드가 선언된 DTO 클래스를 속성값으로 설정
  • ⇒ 클래스명 대신 별칭 사용 가능⇒ PK 제약조건이 부여된 컬럼값을 매핑 처리할 때 사용
    • 검색행의 컬럼값을 클래스의 필드에 저장되도록 매핑 설정하는 엘리먼트
    • column 속성 : 검색행의 컬럼값이 저장된 컬럼명을 속성값으로 설정
    • property 속성 : 검색행의 컬럼값이 저장될 클래스의 필드명을 속성값으로 설정
    result
    • 검색행의 컬럼값을 클래스의 필드에 저장되도록 매핑 설정하는 엘리먼트
  • id

DTO 클래스의 기본 생성자를 사용하여 인스턴스 생성 후 Setter 메서드를 호출하여 검색행의 컬럼값을 전달받아 인스턴스의 필드값으로 변경 → 생성자로 하는 방법 있지 않을까?

constructor

  • 매개변수가 선언된 생성자를 이용하여 DTO 인스턴스를 생성하고 생성자의 필드 초기화 명령을 이용하여 검색행의 컬럼 값을 필드 값으로 저장되도록 매핑 처리
  • 생성자를 이용하여 매핑 처리하기 위한 정보를 제공하는 상위 엘리먼트
  • ⇒ idArg 엘리먼트와 arg 엘리먼트를 하위 엘리먼트로 사용하여 매핑 정보 제공
  • ⇒ 생성자 매개변수와 하위 엘리먼트의 갯수와 Java 자료형이 반드시 일치해야만 생성자를 이용하여 매핑 처리
    • idArg : 검색행의 컬럼값을 생성자 매개변수에 전달하여 저장하는 엘리먼트
    • ⇒ PK 제약 조건이 부여된 컬럼값을 매핑 처리할 때 사용
    • arg : 검색행의 컬럼값을 생성자 매개변수에 전달하여 저장하는 엘리먼트
    • javaType 속성 : 검색행의 컬럼값이 저장될 매개변수의 Java 자료형을 속성값으로 선언

selectKey 엘리먼트 ⇒ 답변형 게시판에 좋다. (시퀀스)

  • SELECT 명령의 검색 결과값을 인스턴스의 필드값으로 저장하기 위한 엘리먼트
  • ⇒ insert 엘리먼트의 종속된 하위 엘리먼트
  • ⇒ 자동 증가값 또는 난수값을 검색하여 인스턴스의 필드에 저장
  • resultType 속성 : SELECT 명령의 검색 결과값을 매핑하여 제공하기 위한 Java 자료형을 속성값으로 설정
  • keyProperty 속성 : SELECT 명령의 검색 결과값을 저장하기 위한 인스턴스의 필드명을 속성 값으로 설정
  • order 속성 : [BEFORE] & [AFTER] 중 하나를 속성값으로 설정

DAO

SqlSession.getMapper(Class<T> clazz)

  • 메모리에 저장된 인터페이스(Clazz - 인터페이스 맵퍼) 전달받아 Mapper 인스턴스를 생성하여 반환하는 메서드
  • ⇒ 매개변수에 xxx.class 형식으로 Class 객체(Clazz)를 전달하여 저장
  • Class.forname()을 이용하는 방법

Mapper

  • 인터페이스 맵퍼의 추상메서드를 호출하여 등록된 SQL 명령을 제공받기 위한 인스턴스

mybatis-config.XML

package (계속 매핑 안해도 됨) ⇒ 대신 패키지 안에 다 만들자

  • 특정 패키지에 작성된 모든 Interface 맵퍼 파일을 자동으로 맵퍼로 등록되도록함.
  • name 속성 : 맵퍼로 등록될 Interface 맵퍼 파일의 패키지를 속성값으로 설정

DTO

  • SQL 명령은 대소문자를 구분하지 않아 식별자를 선언할 때 스네이크 표기법 사용
  • 스네이크 표기법(Snake Case) : 식별자 선언시 단어와 단어를 구분하기 위해 _ 기호 사용
  • Java 자료형 (Class, Interface, Enum)은 파스칼 표기법 사용
  • ⇒ 파스칼 표기법(Pascal Case) : 모든 단어의 첫문자를 대문자로 표현하여 식별자 선언
  • Java 자료형을 제되한 식별자는 카멜 표기법을 사용하여 선언

DAO에 들어가는 내용이 반복된다?

⇒ 반복되는 내용을 따로 빼서 클래스를 만들자 (유지보수)

  • SqlSessionFactory 인스턴스를 생성하여 반환하는 기능을 제공하는 클래스 생성
  • ⇒ 맵퍼를 사용하는 DAO 클래스가 상속받기 위한 부모클래스
  • ⇒ 상속을 목적으로 작성된 클래스이므로 추상클래스로 선언하는 것을 권장

 


 파이널 프로젝트

> 오후 9시 UI 관련회의

> 정기 배송 및 글 작성 통일 가능 여부 결정

> 정기 배송 추가 및 상세 여부 결정 

> 대략적인 부트스트랩 중간 확인

> 내일 ui 회의

반응형

'레거시' 카테고리의 다른 글

2022.02.27의 기록  (0) 2022.02.27
2022.02.25의 기록  (0) 2022.02.25
2022.02.23의 기록  (0) 2022.02.23
2022.02.22의 기록  (0) 2022.02.22
2022.02.21의 기록  (0) 2022.02.21