학습계획
- 데이터 베이스 PK 특징
- 토비의 스프링 1.5절까지 학습
- mybatis #{}, ${} 차이
Today I Learned
데이터 베이스에서 PK를 row를 식별하는 값으로 PK를 설정하지 않았을때 아래와 같은 문제 발생합니다.
- row를 식별하는 키이므로 데이터 중복이슈가 발생할 수있습니다.
- 데이터 무결성이 깨지는 문제가 발생할 수 있습니다.
- 개체 무결성(entity integrity)
- 모든 테이블이 기본키를 가져야 하며, PK는 고유해야하며 null을 허용하지 않는다.
- 참조 무결성(referential integrity)
- 하나의 테이블의 PK는 다른 테이블에서 참조키(FK)로 사용되므로 참조관계가 깨질 수 있다.
토비의 스프링 - 오브젝트와 의존관계
1.3 DAO의 확장
- 낮은 결합도
- 느슨한 연결은 관계를 유지하는데 꼭 필요한 방법만 간접적인형태로 제공하고, 나머지는 서로 독립적이고 알필요도 없게 만들어주는것
- 결합도(하나의 오브젝트가 변경이 일어날때 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도)가 낮아지면 변화 속도가 높아지고, 구성이 깔끔해진다.
- 전략패턴
- 자신의 기능 맥락에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리하고, 이를 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용하는 패턴
- 스프링 프레임워크
- 객체지향적 설계 원칙과 디자인 패턴에 나타난 장점을 개발자들이 활용할 수 있게 해주는 프레임워크
1.4 제어의 역전(IoC)
- 팩토리
- 객체의 생성 방법을 결정하고 생성된 오브젝트를 돌려주는 역할
- 디자인패턴의 팩토리패턴, 펙토리 메서드 패턴과는 다름
- 프레임 워크도 제어의 역전 개념이 적용된 대표적 기술. 제어의 역전 개념이 적용되어야 프레임워크라고 할 수 있다.
- 라이브러리를 사용하는 어플리케이션 코드는 어플리케이션 흐름을 직접 제어한다. 단지 동작 중 필요한 경우만 능동적으로 라이브러리를 사용
- 프레임워크는 반대로 프레임워크에 의해 어플리케이션 코드가 사용됨
1.5 스프링 IoC
- bean
- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
- bean factory
- 스프링에서 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트
- Application Context
- bean factory에서 조금 더 확장한 개념으로 더 자주사용된다.
#{} (Parameter)
String selectPerson = "SELECT * FROM PERSON WHERE ID=?"
PreparedStatement ps = connection.prepareStatement(selectPerson);
ps.setInt(1, id);
PreparedStatement 문에서 파라미터를 생성하는 역할을 한다. #{}은 JDBC프로그래밍에서 “?”에 해당된다. #{}구문은 mybatis가 String으로 변경하여 문자열을 추가하게 된다.
위의 코드는 아래와 같은 동작을 하게 된다.
SELECT * FROM PERSON WHERE ID="testMember"
${}(String Substitution)
직접 값을 주입하고 싶은 경우 사용. ${}를 사용하면 마이바티스는 문자열로 변환하지 않고 주입하게 된다. 이는 컬럼명이나 테이블명을 셋팅할 때 유용하다.
@Select("select * from user where ${column} = #{value}")
User findByCoulmn(@Param("column")String column, @Param("value") String value);
ORDER BY ${columnName}
하지만 위의 방식은 SQL Injection 공격에 취약 하므로, 해당 필드에 사용자 입력을 방지하거나 자체 검사를 수행해야한다.
- SQL Injection 공격
- 해커가 임의의 SQL문을 주입하고 실행하여 데이터베이스 동작을 조작하는 행위
[참고]
https://mybatis.org/mybatis-3/sqlmap-xml.html#string-substitution