본문 바로가기
레거시

2022.02.28의 기록

by GroovyArea 2022. 2. 28.

 하루 

=>  공부 관련

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 엘리먼트의 매핑정보를 상속받아 사용 (중복되는 엘리먼트를 제거)
    discriminator 엘리먼트
    • 검색행의 컬럼값을 비교하여 다른 매핑정보를 제공하기 위한 상위 엘리먼트
    • ⇒ 하위 엘리먼트 : 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