반응형

**@Autowired

=>동일한 자료형의 bean이 있으면 자동으로 주입시켜주는 어노테이션

=>클래스 안에서 변수를 선언하고 위에 @Autowired를 추가하는 형태로 작성

=>이 어노테이션 아래 선언한 변수는 setter메소드를 만들지 않아도 자동으로 주입이 됩니다.

=>이 어노테이션이 작성되면 반드시 동일한 자료형이 bean이 생성되어야 합니다.

bean이 없으면 bean이 없다고 예외가 발생

동일한 자료형의 bean2개 이상이어도 예외가 발생

=>나중에 bean을 생성할 거라면 @Autowired(required= false)를 설정하면 예외가 발생하지 않음

=>동일한 자료형의 bean2개 이상인 경우에는@Autowired아래에 @Qulifier(beanid)를 추가하면됩니다.

 

 

=>jdk 1.8 이상을 사용하는 경우에는 @Resource(name=빈의 아이디)를 이용해서도 설정 가능

=>inject라는 라이브러리를 추가하면 @Inject로도 주입을 받을 수 있습니다

 

 

Maven- build tool

spring-java Framework

 

실습

1.spring을 사용하는 maven프로젝트 생성- java application프로젝트

=>stseclipsests 플러그 인을 설치하고 [Spring Legacy Project]- [Spring Simple Mavern]프로젝트를 생성

프로젝트가 제대로 만들어지지 않고 MF파일만 생성

1)    Project를 선택하고 Mavern프로젝트로 변환

=>프로젝트를 선택하고 마우스 오른쪽을 클릭한 후 [Cofigure]-[Convert to Maven Project]

=>프로젝트에 M이 보이고 pom.xml파일이 생성

 

2)    Project에서 spring을 사용할 수 있는 설정을 추가

=>pom.xml파일의 project태그 안에 추가

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>spring</groupId>

  <artifactId>spring</artifactId>

  <version>0.0.1-SNAPSHOT</version>

 

  <!-- 이 코드를 pom.xml 파일에 붙여 넣습니다. -->

           <!-- 자주 사용하는 버전들의이름을 변수로 등록해두는 것이 properties입니다.

           없다고 해서 되지 않는 것은 아니다.-->

           <properties>

                       <!-- Generic properties -->

                      <!-- 자바 버전 -->

                       <java.version>1.8</java.version>

                       <!-- 소스 코드와 출력되는 결과의 인코딩 설정 -->

                       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

                       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

 

                       <!-- Spring -->

                       <!-- spring 버전 3-5까지  4.0.1, 5.0.7 -->

                       <spring-framework.version>5.0.7.RELEASE</spring-framework.version>

 

                       <!-- Hibernate / JPA(요즘에는 ) :하이버네이트-->

                       <hibernate.version>4.2.1.Final</hibernate.version>

 

                       <!-- Logging -->

                       <!-- 로그 라이브러리 버전 -->

                       <logback.version>1.0.13</logback.version>

                       <slf4j.version>1.7.5</slf4j.version>

 

                       <!-- Test -->

                       <!-- junit버전을 4.12이상 사용하는 것을 권장 -->

                       <junit.version>4.12</junit.version>

           </properties>

          

           <!-- 중앙 저장소 이외에서 다운로드 받아야 할 때 설정: 다운로드 받는 서버를 설정 -->

           <repositories>

          

           </repositories>

          

           <!-- 실제 사용할 라이브러리를 설정`-->

           <dependencies>

                       <!-- Spring and Transactions -->

                       <!-- Spring 기본 라이브러리 -->

                       <dependency>

                                  <groupId>org.springframework</groupId>

                                  <artifactId>spring-context</artifactId>

                                  <version>${spring-framework.version}</version>

                       </dependency>

                       <!-- spring트랜잭션 라이브러리 -->

                       <dependency>

                                  <groupId>org.springframework</groupId>

                                  <artifactId>spring-tx</artifactId>

                                  <version>${spring-framework.version}</version>

                       </dependency>

 

                       <!-- Logging with SLF4J & LogBack -->

                       <!-- 로그  라이브러리  -->

                       <!-- compile할때만 사용한다. 끝나면 없어진다. -->

                       <dependency>

                                  <groupId>org.slf4j</groupId>

                                  <artifactId>slf4j-api</artifactId>

                                  <version>${slf4j.version}</version>

                                  <scope>compile</scope>

                       </dependency>

                       <!-- runtime 실행할 때  -->

                       <dependency>

                                  <groupId>ch.qos.logback</groupId>

                                  <artifactId>logback-classic</artifactId>

                                  <version>${logback.version}</version>

                                  <scope>runtime</scope>

                       </dependency>

 

                       <!-- Hibernate -->

                       <dependency>

                                  <groupId>org.hibernate</groupId>

                                  <artifactId>hibernate-entitymanager</artifactId>

                                  <version>${hibernate.version}</version>

                       </dependency>

 

                       <!-- Test Artifacts -->

                       <!-- spring test -->

                       <!-- 이 라이브러리들은 test할 때만 존재하고 배포할 때는 자동으로 없어집니다. -->

                       <dependency>

                                  <groupId>org.springframework</groupId>

                                  <artifactId>spring-test</artifactId>

                                  <version>${spring-framework.version}</version>

                                  <scope>test</scope>

                       </dependency>

          

                       <!-- junit -->

                       <dependency>

                                  <groupId>junit</groupId>

                                  <artifactId>junit</artifactId>

                                  <version>${junit.version}</version>

                                  <scope>test</scope>

                       </dependency>

 

           </dependencies>

</project>

 

2     하는 자바 버전 변경

=>프로젝트를 선택하고 마우스 오른쪽을 클릭해서 [Build Path]-[Condigure Build Path]를 선택

=>JRE System Libarry를 선택하고 Edit를 눌러서 원하는 버전으로 변경 - 1.8 이상으로 변경

 

3     일반 프로젝트 구조

Dao -> service ->controller

 

1)    Dao클래스를 만들고 메소드 1개를 추가

=>di.Dao

public class Dao {

           public void insert() {

                       System.out.println("데이터 삽입 성공");

           }

}

 

2)    Service 클래스를 만들고 메소드를 1개 추가

=>di.Service

=>Dao 클래스의 인스턴스를 생성

           package di;

 

public class Service {

           //서비스가 Dao를 사용

           private Dao dao;

 

           public Dao getDao() {

                       return dao;

           }

 

           public void setDao(Dao dao) {

                       this.dao = dao;

           }

          

           public void insert() {

                       dao.insert();

           }

 

}

 

3)    Controller클래스를 추가하고 작성

package di;

 

public class Controller {

      private Service service;

 

      public Service getService() {

                 return service;

      }

 

      public void setService(Service service) {

                 this.service = service;

      }

     

      public void insert() {

                 service.insert();

      }

}

 

4)    Main메소드릉를 소유함 Main클래스를 만들고 작성

 

 

 

5 Spring에서는 개발자가 직접 생성자를 호출해서 인스턴스 만드는 것을 권장하지 않음

=>개발자가 클래스를 만들 때 디자인 패턴을 적용해서 만들고 수명 주기를 직접 관리해야 합니다.

클라이언트는 필요할 때 만들어야 한다.

1)    Spring bean configuration파일을 추가하고 작성

app.xml

      <!-- id는 개발자가 정하는 구별하기 위한 이름이고 class는 인스턴스를 생성할 클래스이름 -->

      <bean id ="dao" class="di.Dao"></bean>

      <bean id="service" class="di.Service"/>

      <bean id="controller" class="di.Controller"/>

 

2)    main 메소드 수정

                 //spring Bean설정 파일의 내용 가져오기

                 GenericXmlApplicationContext context = new GenericXmlApplicationContext("classpath:app.xml");

                 //설정 파일에서 bean 가져오기

                 Dao dao = context.getBean("dao",Dao.class);

                

                 Service service = context.getBean("service", Service.class);

                 service.setDao(dao);

                

                 Controller controller = context.getBean("controller", Controller.class);

                 controller.setService(service);

                 controller.insert();

                

                 context.close();

 

 

6 DI(Dependency Injdection -의존성 주입)

=>다른 클래스의 객체를 외부에서 생성해서 대입해주는 것

=>생성자를 이용하는 방법과 프로퍼티(setter)를 이용하는 방법

=>Spring 에서는 의존성 주입도 자바 코드가 아니라 설정에서 가능합니다.

 

<bean id="아이디" class="클래스경로">

      <constructor-arg value ="" />또는

<constructor-arg><ref bean ="다른 bean아이디"></constructor-arg>

 

<property name ="프로퍼티이름" value ="" /> 또는

<property name ="프로퍼티이름"><ref bean="다른 bean 아이디"/></propery>

</bean>

 

1)    app.xml을 수정

      <bean id ="dao" class="di.Dao"></bean>

      <bean id="service" class="di.Service">

                 <property name="dao">

                            <ref bean ="dao"/>

                 </property>

      </bean>

      <bean id="controller" class="di.Controller">

                 <property name="service">

                            <ref bean="service"/>

                 </property>

      </bean>

 

2)    main 메소드 수정

                 //spring Bean설정 파일의 내용 가져오기

                 GenericXmlApplicationContext context = new GenericXmlApplicationContext("classpath:app.xml");

                 //설정 파일에서 bean 가져오기

                 Dao dao = context.getBean("dao",Dao.class);

                

                 Service service = context.getBean("service", Service.class);

                 //설정 파일에서 주입을 했다면 주입하는 코드가 필요 없습니다.

                 //자바 코드는 없어지고 중간과정은 코드에서 사용하지 말자

                 //필요한 것만 사용

                 //service.setDao(dao);

                

                 Controller controller = context.getBean("controller", Controller.class);

                 //controller.setService(service);

                 controller.insert();

                

                 context.close();

 

 

7 Autowired

=>변수 위에 @Autowird를 추가하면 동일한 자료형의 bean이 있으면 자동으로 주입

setter도 필요없습니다.

=>어노테이션을 이용한 설정을 사용할려면 spring설정파일에 <context:annotaion-config/>가 추가되어야 합니다.

 

1)service클래스 수정

public class Service {

           //서비스가 Dao를 사용

           @Autowired //Dao가 클래스 타입의 bean이 있으면 자돋으로 주입

           private Dao dao;

           /*

           public Dao getDao() {

                       return dao;

           }

 

           public void setDao(Dao dao) {

                       this.dao = dao;

           }

           */

           public void insert() {

                       dao.insert();

           }

 

}

 

2)controller클래스 수정

public class Controller {

           @Autowired

           private Service service;

 

           /*

            * public Service getService() { return service; }

            *

            * public void setService(Service service) { this.service = service; }

            */

          

           public void insert() {

                       service.insert();

           }

}

 

3) app.xml수정

=>context namespace를 추가

 

           <bean id ="dao" class="di.Dao"></bean>

           <bean id="service" class="di.Service"></bean>

           <bean id="controller" class="di.Controller"></bean>

          

           <!-- namespace가 있어야 한다. -->

           <!-- 어노테이션 설정을 적용하기 위한 태그 -->

<context:annotation-config></context:annotation-config>

 

8 bean의 자동 생성

<context:component-scan base-package ="패키지이름" />

=>패키지에 속한 클래스 중에서 클래스 선언 위에 @Componet, @Controller, @Service, @Repository어노테이션이 추가된 클래스의 beam을 자동 생성

이 때 beanid는 클래스 이름의 첫글자를 소문자로 변경한 것입니다.

bean 을 만드는 코드를 쓸 필요없다.

 

1)controller, service, dao클래스 위에 @Component추가

 

2) app.xml수정

 

3)Main 클래스 수정

                       //spring Bean설정 파일의 내용 가져오기

                       GenericXmlApplicationContext context = new GenericXmlApplicationContext("classpath:app.xml");

                       //설정 파일에서 bean 가져오기

                       //Dao dao = context.getBean("dao",Dao.class);

                      

                       //Service service = context.getBean("service", Service.class);

                       //설정 파일에서 주입을 했다면 주입하는 코드가 필요 없습니다.

                       //자바 코드는 없어지고 중간과정은 코드에서 사용하지 말자

                       //필요한 것만 사용

                       //service.setDao(dao);

                      

                       Controller controller = context.getBean("controller", Controller.class);

                       //controller.setService(service);

                       controller.insert();

                      

            context.close();

 

 

**spring Mavern Project 의 테스트

=>Sprigng Project에서 테스트는 JUnit Spring-test 라이브러리를 이용

=>테스트는 점점 중요하게 평가받는데 최근에는 TDD(Test Driven Development)라는 개발 방법론도 등장

예전에는 어떤 기능을 전부 완성하고 테스트를 수행했습니다.

에러나 예외가 발생하면 디버깅하기가 어려웠고 웹 프로젝트 같은 경우는 거의 모든 부분을 완성해야 테스트를 할 수 있었음

 

어떤 기능이 있으면 작은 부분으로 쪼개서 가장 작은 부분 부터 제대로 수행되는지 테스트를 하고 이 코드가 테스트를 통과하면 다음 부분을 붙이는 형태로 프로그래밍을 하는 방식이 TDD입니다.

 

생년월일을 입력받아서 나이 계산

=>생년월일을 입력받기

=>올해 년도 가져오기

=> 올해 년도에서 생년월일 빼서 계산

 

내가 할 수 있는 최소한 부분을 나누어서 하기

***

**

*

**

***

SPRING TEST어려운 것은 설정파일이다. APP.XML

설정파일의 내용을 실행하도록 해야 한다.

 

 

=>SPRING에서 설정 파일에 있는 내용을 읽어서 테스트하는 방법

1. Test클래스를 생성하고 상단에 작성

@RunWith(SpingJUnit4ClassRunner.class)

@ContextConfiguration("설정파일의 경로를 작성")

=>설정 파일의 내용을 읽어서 사용이 가능

 

 

2.Service클래스의 insert메소드를 테스트

1)jnit버전에 4.10 이상인지 확인 -pom.xml파일에서 확인

 

 

2)spring-test라이브러리의 의존성이 설정되어있는지 확인

dependenciest->spring-test

 

test에서 하면 배포될때 없어질것이다.

 

C:\Users\admin\.m2\repository

eclipse 끄고 repository에 잇는 것을 전부 삭제하기

삭제한다음 07. spring\03. repository에 복사해서 옇기

 

 

lombok =>dto클래스

DTO ->속성들을 묶어서 표현하기 위한 클래스

class DTO{

           변수

           생성자

           접근자

}

 

**lombok

1.DTO클래스 -관계형 데이터베이스에서 테이블을 표현하기 위한 클래스

=>여러 개의 속성들을 묶어서 하나로 표현하기 위한 클래스

=>속성들을 private변수로 생성

=>매개변수가 없는 생성자와 매개변수가 있는 생성자를 생성

=>접근자 메소드를 생성

=>toStrin g메소드 재정의

 

2.DTO클래스를 만들 때 속성만 정의하고 어노테이션을 이용해서 나머지 작업을 수행해주는 라이브러리

 

 

3.설치

1)https://projectlombok.org/download에서 jar파일을 다운로드

 

2)jar파일을 생성 -command창에서 실행

java -jar lombok.jar

 

 

3)사용할 ide목록이 나오면 ide를 선택하고 [install/updata]를 ㅅ클릭

 

4)eclipse재시작

 

5)프로젝트 rebuild

이클립스 Lombok 사용시 Warning 문제 해결

 

 

4.lombok사용

1)pom.xml파일에 lombok 의 의존성 추가

                       <!-- lombok의 의존성 -->

                       <dependency>

                                  <groupId>org.projectlombok</groupId>

                                  <artifactId>lombok</artifactId>

                                  <version>1.18.8</version>

                       </dependency>

 

 

2)dto클래스 위에 작성

@Getter:모든 변수들의 getter메소드 생성

@Setter:모든 변수들의 setter 메소드 생성

@ToString

@Data: 생성자 , 접근자 메소드 ToString 전부 생성

 

 

 

**데이터베이스 사용

1.    프로그래밍 언어에서 데이터베이스를 사용하는 방법

1)    언어가 제공하는 코드를 이용

2)    프레임워크를 이용하는 방법

 

=>언어를 이용해서 작성하면 프레임워크의 영향을 받지 않기 때뭄에 프레임워크를 종속되지 않음

프레임워크를 사용하면 중북된 코드등을 제거하기 때문에 개발속도가 빠릅니다.

 

2.데이터베이스 연동 프레임워크의 종류

1) SQL Mapper:SQL과 프로그래밍 언어 코드를 분리시켜서 작성

=>sql을 작성하는 별도의 파일이나 클래스를 만들고 프로그래밍 언어가 호출하는 방식

=>개발이 쉽지만 성능은 떨어짐

 

2ORM(Object Relation Mapping) :프로그래밍언어의 클래스와 관계형 데이터베이스의 테이블을 매핑하는 방식으로 sql없이 작업

=>별도의 설정 파일을 이용해서 테이블과 클래스를 매핑시키고 실제 작업을 할 때는 클래스의 인스턴스를 가지고 작업

=>최근의 거의 모든 언어에서 지원을 하는 방식인데 sql mapper보다는 어렵지만 성능이 좋습니다.

 

 

 

3.Java의 데이터베이스 프레임워크

1)Mybatis: sql mapper방식

=>sqlxml파일이나 인터페이스에 작성하고 클래스에서 호출하는 방식

=>쉬워서 si업계에서 많이 사용

 

2)HIbernate:orm

=>sql을 이용하지 않고 자신만의 문법으로 관계형 데이터베이스를 사용하는 방법

=>어렵지만 성능이 좋아서 솔루션 업체에서 선호

=>최근에는 jpa와 같이 사용

 

 

**Mybatis

1.특징

=>javasql mapper framework

=>다른 언어 버전도 존재

 

2.spring project에서 mybatis를 사용할 때 필요한 라이브러리

=>spring-jdbc, mybatis, mybatis-spring

 

3.spring에서 데이터베이스를 사용할 떄는 데이터베이스 접속 정보를 반드시 bean으로 만들어야 합니다.

코드로 직접 설정하는 것은 안됩니다ㅏ.

 

4.spring에서 데이터베이스 접속정보를 저장하는 bean생성

org.springframework.jdbc.datasource.DriverManagerDataSource 클래스의 bean을 생성

 

=>필수

=>driverClassName 프로퍼티 : 데이터베이스 종류

=>url프로퍼티: 데이터베이스 접속 위치

 

 

=>username 프로퍼티: 계정 설정

=>password 프로퍼티: 비밀번호

 

usernamepassword는 입력하지 않아도 되는 경우가 있습니다.

 

 

 

5. 오라클 사용 준비와 접속 확인

=>url: ip주소

=>username:user01~ user30

=>password : user01 ~ user30

 

 

1)java에서 오라클을 사용할 려면 오라클 라이브러리를 다운로드 받아야 합니다.

=>pom.xml에 작성

=>오라클은 중앙 저장소에서 드라이버를 다운로드 제공하지 않기 때문에 repository를 설정해야 합니다.

 

 

=>dependencies 태그 바깥에 작성

           <!-- 중앙 저장소 이외에서 다운로드 받아야 할 때 설정: 다운로드 받는 서버를 설정 -->

           <repositories>

                       <repository>

                                  <id>codelds</id>

                                  <url>https://code.lds.org/nexus/content/groups/main-repo</url>

                       </repository>

           </repositories>

 

=>dependencies안에 작성

                       <dependency>

                                  <groupId>com.oracle</groupId>

                                  <artifactId>ojdbc6</artifactId>

                                  <version>11.2.0.3</version>

                       </dependency>

 

=>위 작업을 했는데 에러 표시가 나는 경우 - 다운로드를 반을 수 없다라는 에러

 

=>repositories수정

           <repositories>

<!--                 <repository>

                                  <id>codelds</id>

                                  https://code.lds.org/nexus/content/groups/main-repo

                       </repository> -->

                       <repository>

                                  <id>oracle</id>

                                  <name>ORACLE JDBC Repository</name>

                                  <url>http://maven.jahia.org/maven2</url>

                       </repository>

           </repositories>

 

=>dependency 수정

                       <!-- 오라클 의존성 -->

                       <dependency>

                                  <groupId>com.oracle</groupId>

                                  <artifactId>ojdbc7</artifactId>

                                  <version>12.1.0.2</version>

                       </dependency>

 

3)spring bean configuration파일을 추가하고 데이터베이스 접속 정보를 작성

            <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">

                       <property name="driverClassName"  value="oracle.jdbc.driver.OracleDriver" />

                       <property name="url" value="jdbc:oracle:thin:@ip주소:1521:xe" />

                       <property name="username"  value="user29" />

                       <property  name="password"  value="user29"/>

           </bean>

 

4) class이름에 에러

=>클래스 이름을 잘못 기재했거나 라이브러리가 다운로드 안된 겁니다.

=>pom.xml에 가서 클래스가 소속된 라이브러의 의존성을 설정했는지 확인해보고 설정했는데도 에러가 나면 다운로드가 제대로 안되는 것이므로 버전을 변경해보고 m2디렉토리를 삭제하고 다시 실행을 합니다.

 

org.springframework.jdbc.datasource.DriverManagerDataSource오류가 날 경우

=>pom.xml 파일에 spring-jdbc라이브러리의 의존성을 설정

                       <!-- spring에서 데이터베이스 사용할 때  사용할 라이브러리 의존성 -->

                       <dependency>

                                  <groupId>org.springframework</groupId>

                                  <artifactId>spring-jdbc</artifactId>

                                  <version>${spring-framework.version}</version>

                       </dependency>

 

디비 연력이 잴 먼저이다.

 

5)main 메소드를 소유한 클래스를 만들어서 데이터베이스 연결

 

 

 

6. Maven Projectgithub에서 내려받은 경우에는 마우스 오른쪽을 클릭해서 [Maven]-[Update Project]메뉴를 설정해야 합니다.

 

**MyBatis사용

1.java에서 Mybatis를 사용하는 방법

1)xml을 이용하는 방법

2)인터페이스를 이용하는 방법

 

2.xml을 이용하는 방법

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

=>dto클래스의 패키지를 등록해서 mapper파일에서 패키지이름을 작성하지 않고 dto클래스를 사용하거나 mapkey이름과 데이터베이스의 컬럼이름 매핑등을 설정

 

2)mapper파일을 생성하고 필요한 sql을 작성

 

3)spring설정 파일에 sqlsession클래스의 bean 을 등록

 

4)dao클래스에 sqlsession을 주입받아서 sql을 생성

 

 

**실습

1.    실습에 사용할 테이블과 샘플 데이터를 생성

CREATE TABLE goods(

      code NUMBER(6) PRIMARY KEY,

      name varchar2(50) NOT NULL,

      manufacture varchar2(50),

      price number(10)

);

 

INSERT INTO goods(code, name,MANUFACTURE, PRICE)

VALUES (1,'낙지','목포',8000);

 

 

INSERT INTO goods(code, name,MANUFACTURE, PRICE)

VALUES (2,'과배기','포항',20000);

 

 

 

INSERT INTO goods(code, name,MANUFACTURE, PRICE)

VALUES (3,'인삼','금산',200000);

 

COMMIT;

 

SELECT * FROM GOODS;

 

 

2.    프로젝트에 테이블의 데이터와 매핑할 dto클래스를 생성

//접근자 메소드의 tosTRING메소드를 만들어주는 어노테이션

@Data

public class Good {

      private int code;

      private String name;

      private String manufacture;

      private int price;

}

 

 

3.    MyBatis 사용 설정

=>mybatismybstis-spring 라이브러리 설정

=>

               <dependency>

                                  <groupId>org.mybatis</groupId>

                                  <artifactId>mybatis</artifactId>

                                  <version>3.4.6</version>

                       </dependency>

                       <dependency>

                                  <groupId>org.mybatis</groupId>

                                  <artifactId>mybatis-spring</artifactId>

                       <version>1.3.2</version>

 

4.    mybatis 환경 설정 파일

=>dto클래스의 패키지이름이나 map의 컬럼 매핑 등을 설정

 

**xml

1.데이터를 표현하는 파일

=>상단에 dtd(!DOCTYPE태그)가 없음

=>개발자가 파싱해서 원하는 대로 사용

 

2.설정 파일

=>상단에 dtd(!DOCTYPE태그)가 있음

파일의 내용을 DTD에 설정한 곳에서 해석

=>정해진 규칙대로 코드를 작성

 

 

=>루트 디렉토리에 mybatis-config.xml 파일로 생성

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

           <typeAliases>

                       <!-- sql파일에서는 sqlmapper 페키지이름을 생략할 수 있음 -->

                       <package name="sqlmapper"/>

           </typeAliases>

</configuration>

 

 

5.sql mapper파일 생성

=>실행할 sql을 작성하는 파일

1) mybatis와 테이블의 자료형 매핑

number <-> Integer , Double, Float, Byte, Short, Long, BigDecimal

char, varchar2, clob <-> String

data <-> java.sql.Date, java.util.Date

time <-> java.sql.Time, java.util.Date

timestamp <-> java.sql.Timestamp

blob <-> byte[]

 

2)select구문 작성

<select id="구분할 이름" resultType ="결과 자료형" parameterType="맥변수 자료형" >

           select

           from

           where

</select>

=>resultTypeselect절에 작성한 컬럼의 데이터를 전부 저장할 수 있는 자료형

select에서 하나의 컬럼만 가져오는 경우는 그 컬럼의 값을 저장할 수 잇는 자료형

여러 개의 컬럼을 가져오는 경우는 java.util.Map이나 dto클래스이름을 적어야 합니다.

=>parameterTypewhere절에서 값을 나중에 결정하는 것들 전체를 저장할 수 있는 자료형

select에서는 생략되는 경우도 있습니다.

=>where 절에 parameter를 만들 때는 #{컬럼이름}의 형태로 작성

 

 

3)insert,delete,update

<insert id="구분할 이름" parameterType ="매개변수 자료형">

           insert,update, delete구문

</insert>

 

4)Spring Confuguration파일에 설정 파일 등록

<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">

           <property name ="dataSource" ref ="dataSource"/>

           <property name ="configLocation" value ="환경설정 파일 경로"/>

<property name ="mapperLocation" value ="sql 파일 경로"/>

 

</bean>

 

 

 

<bean class="org.mybatis.spring.SqlSessionTemplate" id ="sqlSession">

           <constructor-arg name ="sqlSessionFactory" ref="sqlSessionFactory"/>

</bean>

 

5)Dao클래스에 sqlSession을 주입받아서 sql메소드 호출

List<resultType> selectList("SQL id", 매개변수);

resultType selectOne("SQL id", 매개변수);

int insert("SQL id", 매개변수) //insert대신에 update, delete사용해도 결과는 같음

 

실습

=>mapper 파일들을 저장할  mappers디렉토리를 생성

 

=>mappers 디렉토리에 sql을 작성할 mapper파일을 만들고 sql을 작성

good.xml파일

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="good">

           <!-- goods테이블의 모든 데이터를 읽어오는 sql -->

           <!--  sqlmapper.Good를 해야 한는데 mybatis-config.xml에서 설정하였기 때문에 Good가능

           resultType select절의 컬럼들을 모두 저장할 수 잇는 자료형

           컬럼이 여러개 있 떄는 java.util.Map아니면 자기가 만든 DTO클래스  

           SELECT 에서 parameterType where절에 대입할 데터의 자료형

           없으면 지우면 된다.-->

           <select id="goodList" resultType="Good">

                       SELECT code, name, manufacture,price

                       FROM GOODS

           </select>

          

           <!-- code를 가지고 하나의 데이터를 찾아오는 sql -->

           <select id="gooddetail" resultType="Good" parameterType="java.lang.Integer">

                       SELECT code, name, manufacture,price

                       FROM GOODS

                       where code = #{code}

           </select>

          

           <!-- goods테이블을 데이터를 삽입하는 sql -->

           <insert id="goodinsert" parameterType="Good">

                       INSERT INTO goods(code, name,manufacture, price)

                       VALUES (#{code},#{name},#{manufacture},#{price})

           </insert>

          

           <!-- goods테이블을 데이터를 수정하는 sql -->

           <update id="goodupdate" parameterType="Good">

                       update

                       set name =#{name}

                         , manufacture = #{manufacture}

                         , price = #{price}

                       where code = #{code}

           </update>

          

           <!-- goods테이블에서 code를 이용해서 데이터를 삭제하는 sql -->

           <delete id="gooddelete" parameterType="java.lang.Integer">

                       delete goods where code = #{code}

           </delete>

</mapper>

 

=>spring bean configuration파일에 MyBatis를 사용할 수 있는 Bean 객체를 설정

 

           <!-- MyBatisxml을 이용해서 사용할 떄 필요한 설정 -->

           <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

                       <property name="dataSource" ref ="dataSource"></property>

                       <property name="configLocation" value="classpath:mybatis-config.xml"></property>

                       <property name="mapperLocations" value="classpath:mappers/good.xml"></property>

           </bean>

           <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

                       <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>

           </bean>

 

=>main메소드에서 sql을 호출하는 코드 작성

 

 

=>예외

java.lang.IllegalArgumentException sql의 이름이 잘못될 경우

List<Good> list = sqlSession.selectList("goo.goodList"); =>이름이 잘못 되였을 경우

java,sql.sqlSyntaxErrorException sql이 잘못된 경우

NullPointer Exception: 파라미터를 제대로 대입하지 않아서

 

FIleNotFoundException: Mybatis 설정 잘못

 

Data 개발자

유저 도메인 지식 업무

data<-개발자 api 플랫폼 <- 도메인지식

 

**Mybatis의 장점

=>sqljava코드가 분리가 되기 때문에 유지보수가 용이

=>처음 한 번만 설정이 잘 되면 이후부터는 쉽게 추가가 가능

 

**Mybatis사용시 주의할 점

=>DTO클래스와 매핑을 시킬 때는 컬럼이름과 변수명이 같아야 쉽게 매핑이 됩니다.

이름 맞추기 잘 해야 한다.

 

=>Map을 이용하는 경우에는 오라클의 경우는 컬럼이름이 대문자로 리턴되는데 나머지 데이터베이스는 수문자로 리턴

=>오라클의 number자료형은 Map에 매핑하는 경우 BigDecimal로 매핑되기 때문에 정수나 실수로 사용하고자 할 때는 한번의 변환 과정이 더 필요합니다.

=>Map을 사용하게 되면 번거롭기 때문에 아직까지는 DTO클래스를 만들어서 작업을 하는 경우가 많습니다.

 

반응형

'Study > spring' 카테고리의 다른 글

spring-6  (0) 2020.10.26
spring-5  (0) 2020.10.23
spring-4  (0) 2020.10.23
spring-2  (0) 2020.10.22
spring-1  (0) 2020.10.22

+ Recent posts