=> 공부 관련
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 명령을 구성하는 일부분의 문장을 등록하기 위한 엘리먼트
- sql 엘리먼트에 등록된 SQL 문장을 SQL 명령에 포함하는 엘리먼트
- refid 속성 : sql 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- sql
- 해결 방안 2) : mybatis 환경설정파일에서 setting 엘리먼트를 이용하여 [mapUnderscoreToCamelCase] 이름으로 적용된 실행 관련 값을 [true]로 변경
- ⇒ SQL 명령에서 사용된 스테이크 표기법의 식별자가 자동으로 카멜 표기법으로 변경되어 검색
- resultMap 속성 : 매핑정보가 저장된 resultMap 엘리먼트의 식별자를 속성값으로 설정 - 수동 매핑 처리
resultMap
- 검색행의 컬럼값을 클래스의 필드에 매핑되어 저장되도록 설정하는 상위 엘리먼트
- type 속성 : 검색행의 컬럼값을 저장하기 위한 필드가 선언된 DTO 클래스를 속성값으로 설정
- ⇒ 클래스명 대신 별칭 사용 가능⇒ PK 제약조건이 부여된 컬럼값을 매핑 처리할 때 사용
- 검색행의 컬럼값을 클래스의 필드에 저장되도록 매핑 설정하는 엘리먼트
- column 속성 : 검색행의 컬럼값이 저장된 컬럼명을 속성값으로 설정
- property 속성 : 검색행의 컬럼값이 저장될 클래스의 필드명을 속성값으로 설정
- 검색행의 컬럼값을 클래스의 필드에 저장되도록 매핑 설정하는 엘리먼트
- 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 |