▶ 하루
=> 공부 관련
1) 스프링 개구리책 CH3
2) MVC 객체지향 리팩토링
3) 금일 수업 복습
=> 파이널 프로젝트 관련
1) UI 업무 분담 회의
▶ 문제 정리
▶ 개인 공부
▶ 수업 내용
MyBatis
DB
⇒ DB 여러 테이블 Join 시 중복 컬럼명은 aliasname으로 바꿔준다.
- 테이블 조인 시 동일한 컬럼명을 가진 경우 두번 째 이상의 컬럼명은 자동으로 변경
DTO
- 객체 직렬화 클래스 : Serializable 인터페이스를 상속받은 클래스
- ⇒ 객체 단위로 입력 또는 출력을 위한 클래스 선언 방법
mapper.xml
resultMap 엘리먼트의 하위 엘리먼트 선언 순서
- constructor >> id >> result >> association >> collection >> discriminator
- ⇒ 순서를 안 지키면 에러 떨어짐
- association 엘리먼트로 매핑 설정을 시작한 경우 내부적으로 모든 매핑은 selectOne() 메서드로 단일행에 대한 검색 결과를 제공받아 매핑 처리
⇒ 문제점 )
- resultMap 엘리먼트에서 association 엘리먼트로 매핑 설정을 시작한 경우에 Collection 엘리먼트를 선언하면 다수행의 검색결과에 대한 매핑 처리 불가능 (TooManyResultsException 발생)
⇒ 해결법 )
- resultMap 엘리먼트가 association 엘리먼트가 아닌 다른 엘리먼트로 매핑이 시작되도록 설정
- resultMap 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 ⇒ resultMap 엘리먼트의 매핑정보를 상속받아 사용 (중복되는 엘리먼트를 제거)
- 검색행의 컬럼값을 비교하여 다른 매핑정보를 제공하기 위한 상위 엘리먼트
- ⇒ 하위 엘리먼트 : case 엘리먼트
- javaType 속성 : 비교 컬럼값에 대한 Java 자료형을 속성값으로 설정
- column 속성 : 비교 컬럼값이 저장된 컬럼명을 속성값으로 설정
- case : 검색행의 컬럼값을 비교하여 같은 경우 매핑정보를 제공하기 위한 엘리먼트
- value 속성 : 검색행의 컬럼값과 비교할 값을 속성값으로 설정
- resultMap 속성 : resultMap 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 ⇒ resultMap 엘리먼트의 매핑정보를 제공받아 사용
- ⇒ 자동 매핑이 안되게 컬럼명과 DTO 필드 이름을 달리하는 것이 좋음
- extends 속성 (resultMap 엘리먼트의 속성)
⇒ 공통적인 매핑정보는 discriminator 엘리먼트가 아닌 다른 엘리먼트를 이용하여 매핑 처리
⇒ 포함과 상속을 적절히 이용하여 유지보수와 생산성을 높혀라!
cache
- SELECT 명령의 검색결과를 Cache 메모리에 저장하여 빠른 검색결과를 제공하는 엘리먼트
- ⇒ INSERT, UPDATE, DELETE 명령이 실행되면 Cache 메모리에 저장된 검색결과는 자동 초기화 : AutoFlush
- ⇒ 검색 결과를 저장하는 클래스는 반드시 객체 직렬화 클래스로 선언
- 임시 메모리에 데이터가 저장됨
SQL 명령 작성에 필요한 값을 전달받는 방법
- ⇒ 전달값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현
1. XML 맵퍼에서 SQL 명령이 등록된 엘리먼트의 parameterType 속성값으로 Java 자료형(별칭)을 설정하여 값을 전달 받아 사용
⇒ parameterType 속성값으로 기본형(Wrapper) 또는 String 클래스 설정 - 단일 값(변수명)
⇒⇒ Interface 맵퍼와 바인딩된 경우 전달값에 상관없이 parameterType 속성 생략 가능
⇒ parameterType 속성값으로 DTO 클래스 설정 - 다수값 (필드명)
⇒ parameterType 속성값으로 HashMap 클래스(Map 인터페이스) 설정 - 다수 값 (필드명)
2. Interface 맵퍼에서 추상메서드의 매개변수에 @Param 어노테이션을 설정하여 매개변수로 값을 전달받아 XML 맵퍼의 엘리먼트에 등록된 SQL 명령에서 전달값을 사용
⇒ XML 맵퍼의 SQL 명령이 등록된 엘리먼트에서는 parameterType 속성 생략
하나의 값을 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 기본형(Wrapper) 또는 String 클래스를 설정하고 SQL 명령에서는 전달값을 #{변수명} 형식으로 표현
- 변수명은 식별자 규칙에만 맞게 작성
다수의 값만 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 DTO클래스를 설정하고 SQL 명령에서는 전달값을 #{필드명} 형식으로 표현
- DTO 인스턴스의 필드값을 제공받아 사용
다수의 값만 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 HashMap클래스(Map 인터페이스)로 설정하고 SQL 명령에서는 전달값을 #{맵키} 형식으로 표현
- Map 인스턴스의 맵값을 제공받아 사용 (DTO 만들지 않는 대신 Map을 사용함)
- select 뿐만 아니라 Insert 에도 사용 가능함.
select 엘리먼트의 resultType 속성값을 HashMap 클래스(Map 인터페이스)로 설정하면 검색행의 컬럼명은 맵키로 컬럼값은 맵 값으로 매핑하여 엔트리로 저장하여 검색결과 제공
⇒ 검색행의 컬럼명은 대문자로 검색되므로 맵키를 표현할 경우 대문자로 표현
Interface 맵퍼의 추상메서드 매개변수에 전달된 값을 @Param 어노테이션의 value 속성값을 #{속성값}으로 표현
⇒ parameterType 속성 생략
⇒ @Param : 추상 메서드의 매개변수에 저장된 값을 XML 맵퍼의 엘리먼트에 등록된 SQL 명령에서 사용할 수 있도록 제공하는 어노테이션
⇒ value 속성 : SQL 명령에서 매개변수에 저장된 값에 사용하기 위한 식별자를 속성값으로 설정
⇒ 어노테이션에 다른 속성이 없는 경우 속성값만 설정 가능
#{변수명|필드명|맵키} : ‘전달값’
- 전달값이 SQL 명령에서 문자값으로 표현 됨(컬럼명이 아닌 값으로 표현되는것이다.)
${변수명|필드명|맵키} : 전달값
- 전달값을 SQL 문장(키워드 또는 식별자)으로 표현
⇒ ibatis에서는 $변수명|필드명|맵키$ 형식으로 표현
⇒ $표현식은 InSQL 공격에 취약하므로 사용하는 것을 비권장 (컬럼명 표현할 때만 잠깐 쓰자)
bind (select 엘리먼트 하위 엘리먼트)
- SQL 명령에서 사용할 수 있는 이름과 값을 설정하기 위한 엘리먼트 - 전달값 변경
- name 속성 : SQL 명령에서 사용할 값을 구분하기 위한 식별자를 속성값으로 설정
- value 속성 : SQL 명령에서 사용할 값을 속성값으로 설정
- ⇒ value 속성값으로 전달값을 사용할 수 있으며 문자값 결합 가능( + 연산자) 제공
제일 중요한 것은 resultMap & 동적 SQL
단일 값 & 다수 값 전달
▶ 파이널 프로젝트
> UI 분담 회의 예정 PPT 작업
> 내일 회의 상세 일정 계획 수립
'레거시' 카테고리의 다른 글
2022.03.05~03.06 의 기록 (0) | 2022.03.05 |
---|---|
2022.03.03 의 기록 (0) | 2022.03.03 |
2022.02.27의 기록 (0) | 2022.02.27 |
2022.02.25의 기록 (0) | 2022.02.25 |
2022.02.24 의 기록 (0) | 2022.02.24 |