안드로이드&IOS 앱 개발자 양성

안드로이드&IOS 앱 개발자 양성(61일차)

HRuler 2020. 7. 2. 19:00
더보기

** MySQL MyBatis 연동
1. 데이터베이스 준비
2. Simple Spring Maven 프로젝트 생성
3. MySQL을 MyBatis를 이용해서 사용할 때 필요한 의존성을 설정 - pom.xml
4. 데이터베이스 접속 테스트
5. 위의 설정이 제대로 되었는지 테스트 클래스를 만들어서 테스트
6. 테이블과 매핑이 될 DTO 클래스를 생성
7. MyBatis나 Hibernate 등의 데이터베이스 연동 프레임워크를 사용하면 여기까지는 공통의 작업이다.

** MyBatis를 XMl을 이용해서 사용
1. 매퍼 파일 작성 요령
2. src에 mappers라는 디렉토리를 생성하고 drink.xml 파일을 만들어서 SQL을 작성
3. Spring Bean Configuration 파일에 xml을 이용하는 MyBatis Bean을 생성하는 코드를 작성
4. 설정 확인
5. XML을 이용한 MyBatis 연동 DAO 작성 방법
6. 앞에서 작성한 xml을 호출할 DAO를 생성
7. DrinkDAO 클래스의 bean을 자동으로 생성해주는 설정을 SpringBeanConfiguration 파일을 추가
8. main 메소드에서 DAO를 가져와서 사용

** 새로운 데이터베이스 작업이 필요한 경우
1. mapper 파일에 필요한 SQL을 작성
2. DAO에 적절한 메소드를 만들어서 호출
3. main 메소드에서 테스트

** procedure 실행
1. procedure
2. MyBatis에서 프로시저 호출

** 인터페이스를 이용한 MyBatis 활용
1. 인터페이스에서 SQL 생성
2. MyBatis 사용을 위한 Bean 생성 코드
3. 인터페이스 주입 받아서 메소드 호출

** XML로 작업했던 내용을 인터페이스로 수정하는 방법
1. pom.xml 파일에 데이터베이스, mybatis 관련 의존성을 설정
2. Spring Bean Configuration bean을 생성하는 코드를 작성하고 데이터베이스 연결이 되는지 확인
3. DTO 클래스 생성
4. SQL을 저장하고 실행할 인터페이스를 생성하고 필요한 SQL을 작성
5. 스프링 설정 파일에 매퍼 인터페이스를 사용하는 MyBatis Bean을 생성
6. DrinkMapper를 주입받아서 사용하면 된다.

** MyBatis 로그 확인 방법
1. pom.xml 파일에 의존성 설정
2. 루트 디렉토리(src, src/main/java, src/main/resources 등)에 프로퍼티 설정 파일을 추가 : log4jdbc.log4j2.properties
3. 데이터베이스 접속 부분에 log4jdbc.을 추가

** Transaction
1. ACID 성질
2. 트랜잭션 작업
3. Auto Commit
4. Auto Rollback
5. select는 트랙잭션과 아무런 상관이 없다.
6. MyBatis는 트랜잭션 사용이 옵션이지만 Hibernate는 트랙잭션 사용이 필수이다.

** MySQL MyBatis 연동

1. 데이터베이스 준비

- Drink 테이블

- drinkNum : int

- cafeNickname : char

- drinkName : char

- drinkCost : int

- drinkGrade : int

- drinkImage : char 

2. Simple Spring Maven 프로젝트 생성

 - 안만들어지면 Java Project를 생성해서 Maven Project로 변환

3. MySQL을 MyBatis를 이용해서 사용할 때 필요한 의존성을 설정 - pom.xml

 - MySQL, SpringJDBC, MyBatis, MyBatis-Spring

1) 오라클 사용을 위해서 repository 설정 - 오라클 사용하는 경우에만

2) dependency 설정

4. 데이터베이스 접속 테스트

 - Spring에서는 데이터베이스를 사용할 때 설정 파일에 DataSource를 만들어서 사용하는 것을 강제한다.

 - src 또는 src/main/resources 디렉토리에 spring bean configuration 파일을 추가하고 작성 - applicationContext.xml

5. 위의 설정이 제대로 되었는지 테스트 클래스를 만들어서 테스트

- src/test/java 또는 src 디렉토리에 테스트용 클래스를 생성 - Main

6. 테이블과 매핑이 될 DTO 클래스를 생성

- 자료형과 프로퍼티 이름을 정확하게 입력해야 매핑된다.

7. MyBatis나 Hibernate 등의 데이터베이스 연동 프레임워크를 사용하면 여기까지는 공통의 작업이다.

 ** MyBatis를 XML을 이용해서 사용

 - 환경 설정 파일을 1개 생성 - 생략 가능

 - 패키지이름이 길 때 패키지 이름을 생략하고 DTO를 사용하기 위해서 생성

 - resultMap이라고 해서 DTO에 만든 프로퍼티 이름과 테이블의 컬럼이름이 다를 때 매핑시켜주는 설정을 작성한다.

 - SQL을 작성할 매퍼 파일을 n개 생성 - 필수

 - Spring 설정 파일에 위의 정보를 이용해서 SqlSessionFactoryBean과 SqlSessionTemplate 클래스의 bean을 생성하는 코드를 작성한다.

 - DAO 클래스에서 SqlSession을 주입받아서 사용하면 된다.

1. 매퍼 파일 작성 요령

 - namespace를 생성 - 이 파일의 이름을 설정하는 역할

1) select

<select id = "구별할 이름"

         parameterType = "파라미터 전체를 하나로 묶어서 전달할 자료형"

         resultType = "select절의 컬럼들을 하나로 묶어서 전달할 자료형">

               select 구문

</select>

 - 외부로부터 대입받는 데이터는 ? 대신에 #{이름}의 형태로 작성한다.

 - drinkNum, cafeNickname, drinkName, drinkCost, drinkGrade, drinkImage로 구성된 drink 테이블의 모든 데이터를 가져오는 SQL

<select id = "alldrink" resultType = "mybatis.domain.Drink">

           select *

           from drink

</select>

 - drinkNum을 입력받아서 drinkNum에 해당하는 데이터를 가져오는 SQL

<select id = "getdrink" parameterType = "java.lang.Integer" resultType = "mybatis.domain.Drink">

           select *

           from drink

           whrer drinkNum = #{drinkNum} 

</select>

 - drink 테이블에서 drinkNum에 해당하는 데이터를 찾아오는 SQL

 - Drink 클래스가 없는 경우는 Map을 사용

<select id = "getdrink" parameterType = "java.lang.Integer" resultType = "java.util.Map">

           select *

           from drink

           whrer drinkNum = #{drinkNum} 

</select>

 - drink 테이블에서 drinkNum과 drinkName에 해당하는 데이터를 찾아오는 SQL

 - Drink 클래스가 없는 경우는 Map을 사용

<select id = "getdrink" parameterType = "java.lang.Map" resultType = "java.util.Map">

           select *

           from drink

           whrer drinkNum = #{drinkNum} and drinkName = #{drinkName}

</select>

 - 부등호는 직접 사용할 수 없으니 &It;(<), &gt;(>)

 - like

 - Oracle : '%나 _' || #{keyword} || '%나 _'

 - MySQL : concat('%나 _', #{keyword}, '%나 _')

2) select 이외 구문

 - insert, update, delete 태그로 만드는데 사실 아무 태그나 써도 결과는 같다.

<insert id = "구별할 이름" parameteType = "파라미터를 묶어서 전달할 자료형">

        삽입할 SQL

</insert>

 - drink 테이블에 데이터를 삽입하는 SQL

<insert id = "insertdrink" parameteType = "mybatis.domain.Drink">

        insert into drink(cafeNickname, drinkName, drinkCost, drinkGrade, drinkImage)
        values(#{cafeNickname}, #{drinkName}, #{drinkCost}, #{drinkGrade}, #{drinkImage})

</insert>

2. src에 mappers라는 디렉토리를 생성하고 drink.xml 파일을 만들어서 SQL을 작성

 - 없는 자료형을 사용하면 애플리케이션이 시작될 때 에러가 발생한다.

 - id를 틀리게 호출하거나 parameter가 잘못되면 메소드를 호출할 때 에러가 발생한다.

3. Spring Bean Configuration 파일에 xml을 이용하는 MyBatis Bean을 생성하는 코드를 작성

- SqlSessionFactoryBean, SqlSessionTemplate

4. 설정 확인

 - SqlSessionTemplate을 주입받아 보면 된다.

5. XML을 이용한 MyBatis 연동 DAO 작성 방법

 - SqlSession을 주입받아서 사용한다.

 - SQL 호출

 - 파라미터가 없는 경우는 파라미터 생략이 가능하다.

1) selectList("아이디", 파라미터) : resultType의 List를 리턴

2) selectOne("아이디", 파라미터) : resultType으로 리턴

 - select의 결과가 0개 이면 null이 리턴되고 2개 이상이면 예외가 발생한다.

 - primary key나 unique 제약조건이 설정된 컬럼을 가지고 조회를 하거나 count처럼 집계함수를 이용해서 데이터를 1개만 조회하는 경우에 사용해야 한다.

3) insert("아이디", 파라미터)

4) update("아이디", 파라미터)

5) delete("아이디", 파라미터)

 - insert, update, delete 메소드는 정수를 리턴한다.

 - 정수는 영향받은 행의 개수이다.

 - insert의 경우는 0이 리턴되면 삽입 실패이지만 update와 delete는 0이 리턴되면 조건에 맞는 데이터가 없어서 작업을 수행하지 않은 것이다.

6) 많이 발생하는 예외

 - 아이디를 잘못 입력하는 경우

 - 파라미터를 대입해야 하는데 파라미터를 생략한 경우

 - sql을 잘못 입력해서 SqlException이 발생하는 경우

6. 앞에서 작성한 xml을 호출할 DAO를 생성

 - 여기까지는 프로젝트 종류가 달라져도 코드를 수정할 필요가 없다.

7. DrinkDAO 클래스의 bean을 자동으로 생성해주는 설정을 SpringBeanConfiguration 파일을 추가

 - Spring MVC Project면 할 필요가 없는 작업

1) applicationContext.xml 파일에 context 네임 스페이스를 추가

2) applicationContext.xml 파일에 어노테이션을 사용할 수 있도록 하고 bean을 자동 생성할 패키지를 등록

8. main 메소드에서 DAO를 가져와서 사용

### Cause : java.lange.IllegalArgumentException : Mapped Statements collection does not contain value for drink.allood

- 위의 예외는 sql 이름을 잘못 부른 것이여서, mapper 파일에 작성한 id와 DAO에서 호출한 이름을 확인

### 예외 메시지

 - 예외 메시지에 SQLException이 보이면 SQL 문장을 잘못 입력한 것이므로 - mapper 파일에 가서 SQL을 수정한다.

 - 여러 상황이 나올 수 있으므로 메시지를 잘 읽어봐야 한다.

### 부적합한 열 유형

 - 파라미터를 대입하지 않았거나 DTO를 만들 때 자료형을 잘못 설계한 것이다.

 - 데이터 삽입 작업을 만들 때는 primary key나 unique 제약조건이 설정된 컬럼이 있다면 이 컬럼의 값을 어떤 식으로 만들 것인지 생각해야 한다.

1. Sequence나 Auto_Increment를 이용해서 자동으로 값을 설정

 - Sequence나 Auto_Increment는 증가만 하고 갑소나 삭제는 안되고 초기화는 가능

 - 입력하고 바로 삭제하는 경우 번호를 재사용할 수 없다.

 - 사용하는 관계형 데이터베이스마다 생성하는 방법이 다르다.

2. primary key나 unique한 데이터가 정수라면 가장 큰 정수 값을 찾아서 +1을 해주는 방법

 - 별도의 SQL을 한 번 수행해야 한다.

3. 직접 입력받는 방법

 - 중복 검사를 수행해야 한다.

4. 1번이나 2번으로 생성한 데이터는 순번 이외의 아무런 기능도 없다.

 - 데이터 수정은 데이터 삽입과 모양이 같다.

 - 기본키를 가지고 데이터를 찾아와서 데이터를 화면에 출력한 후 수정할 수 있도록 해주고 수정 작업을 처리한다.

 - 데이터 수정도 삽입처럼 정수가 리턴되는데 0이 아닌 양수면 조건에 맞는 데이터를 수정한 것이고 0이면 조건에 맞는 데이터가 없어서 수정하지 않겠다는 의미이다.

 - 데이터 삭제 : 삭제는 구현을 할 때 비밀번호를 입력을 받거나 정말로 삭제할 것인지 되묻는 작업을 수행하고 삭제한다.

 - 실업무에서는 삭제보다는 대부분 특정 컬럼의 값을 변경해서 삭제된 것 처럼 하는 경우가 많다.

 - 메소드를 구현할 때는 기본키를 매개변수로 받아서 삭제한다.

 ** 새로운 데이터베이스 작업이 필요한 경우

1. mapper 파일에 필요한 SQL을 작성

2. DAO에 적절한 메소드를 만들어서 호출

3. main 메소드에서 테스트

 ** procedure 실행

1. procedure

 - 자주 사용하는 SQL 문을 하나의 이름으로 만들어두고 이름을 호출하는 형태로 실행

 - 프로그래밍 언어의 메소드처럼 사용한다.

 - 프로시저의 장점은 실행속도가 빠르며(한 번 호출되면 메모리에 적재된 상태에서 다음 호출에 이용되기 때문) 보안(SQL을 보여주지 않기 때문에 테이블이 어떻게 구성되었는지 알 수 없기 때문)이 향상된다.

 - 프로시저는 데이터베이스 종류마다 다른 문법으로 작성한다.

 - Oracle에서 프로시저를 만드는 문법을 PL/SQL이라고 하고 MS-SQL Server에서 만드는 문법은 T-SQL이라고 한다.

2. MyBatis에서 프로시저 호출

{

           call procedure이름(파라미터)

}

 - 태그에는 statementType 송성에 CALLABLE을 설정해서 CallableStatement가 호출하도록 해주어야 한다.

 - SqlSession이 호출할 때는 이전처럼 selectList, selectOne, insert, delete, update 메소드로 호출한다.

 

2) 매퍼 파일에서 데이터 삽입하는 SQL을 수정

3) main 메소드에서 테스트

 ** 인터페이스 이용한 MyBatis 활용

 - xml 파일 대신에 인터페이스를 이용해서 MyBatis 연동이 가능하다.

 - 이 방식을 이용하면 별도의 DAO 클래스가 필요 없다.

1. 인터페이스에서 SQL 생성

@Select("sql 구문)

메소드 선언

 - 삽입하는 SQL이면 Select 대신에 Insert, 갱신은 update, 삭제는 Delete 를 사용한다.

2. MyBatis 사용을 위한 Bean 생성 코드

 - SqlSessionFactoryBean에는 dataSource만 설정

<bean

3. 인터페이스 주입 받아서 메소드 호출

 ** XML로 작업했던 내용을 인터페이스로 수정

1. pom.xml 파일에 데이터베이스, mybatis 관련 의존성을 설정

 - Oracle, Spring-JDBC, MyBatis, MyBatis-Sprin 의존성을 설정

2. Spring Bean Configuration 파일에 DataSource bean을 생성하는 코드를 작성하고 데이터베이스 연결이 되는지 확인

1) applicationContext.xml 파일에 데이터베이스 접속 정보 작성

2) 테스트 할 메소드에서 위의 bean을 가져와서 테스트하는 코드를 작성하고 실행

3) 예외가 발생하지 않아야 하고 콘솔에 Connection 관련 텍스트가 출력되어야 한다.

3. DTO 클래스 생성

4. SQL을 저장하고 실행할 인터페이스를 생성하고 필요한 SQL을 작성

5. 스프링 설정 파일에 매퍼 인터페이스를 사용하는 MyBatis Bean을 생성

6. DrinkMapper를 주입받아서 사용하면 된다.

 - XML을 이용하는 방식은 XML 파일에 SQL을 작성하고 DAO 클래스를 만들어서 SQL을 호출하는 형태이다

 - Mapper 인터페이스를 이용하면 하나의 인터페이스에 SQL과 메소드를 같이 선언해서 사용하는 방식인데 복잡한 동적인 SQL을 작성할 때는 불편하다.

 ** MyBatis 로그 확인

- MyBatis를 사용할 때 로그를 조금 더 자세하게 출력하고자 하면 log4jdbc-log4j2-jdbc4 라이브러리를 사용하면 된다.

1.pom.xml 파일에 의존성 설정

2. 루트 디렉토리(src, src/main/java, src/main/resources 등)에 프로퍼티 설정 파일을 추가 : log4jdbc.log4j2.properties

내용 : log4jdbc.spylogdelgator.name = net.sf.log4jdbc.log.slf4j.Slf4SpyLogDelegator

3. 데이터베이스 접속 부분에 log4jdbc.을 추가

 - url의 oracle 앞에 추가

 ** Transaction

 - 논리적 작업단위

 - 한 번에 이루어져야 하는 작업 단위

1. ACID 성질

 - Atomicity : 트랜잭션은 All or Nothing

 - Consistency : 일관성이 있어야 한다.

 - Isolation : 다른 트랜잭션과 격리되어야 한다.

 - Durability : 한 번 완료된 트랜잭션은 계속되어야 한다.

2. 트랜잭션 작업

 - commit : 작업이 완료되서 데이터베이스 원본에 반영

 - rollback : 작업을 취소해서 데이터베이스 원본에 반영하지 않는 것

 - savepoint : rollback 할 지점을 만드는 것

3. Auto Commit

 - SQL이 정상적으로 수행되면 자동으로 Commit되는 경우

 - DDL(Create, Alter, Drop, Truncate, Rename 등)을 성공적으로 수행한 경우

 - DCL(Grant, Revoke - 권한 부여 및 회수)을 성공적으로 수행한 경우

 - 데이터베이스 접속 프로그램을 정상적으로 종료하는 경우

 - 데이터베이스가 정상적으로 종료되는 경우

4. Auto Rollback

 - 접속 프로그램이나 데이터베이스가 비 정상적으로 종료된 경우

5. select는 트랙잭션과 아무런 상관이 없다.

6. MyBatis는 트랜잭션 사용이 옵션이지만 Hibernate는 트랜잭션 사용이 필수