아파트를 만들기 위해서는
어떤 순서대로 지어야 할까??
어떤 재료들을 넣어야 집이 무너지지 않고 제대로 버틸수 있을까?
여러 문명에서는 이미 이 데이터베이스를 가지고 있었다.
문명이 발전 됨에 따라 움집이 아파트가 되고, 수레는 자동차가 되었다.
그렇다면 어떤 원리로 이렇게 성장하였을까?
필요에 따라 만들어진 도구, 모듈/라이브러리라 한다.
조이기 위해 나사와 드라이버가 필요했고 때리기 위해 못과 망치가 필요했다.
근데 사람의 손이 너무 힘든 거라.
그래서 좀 더 편하게 사용할 수 있도록 건전지와 모터 등을 조합해 만든 것이 드릴이다.
라이브러리들의 모음이 바로 프레임 워크인데
현재는 각종 드라이버, 렌치가 달린 로봇팔들이 바로 프레임 워크이다.
컨베이어 벨트를 타고 간 판떼기들이 로봇팔들이 있는 곳으로 도착하여
찍히고 눌리고 변형된 자동차의 부품이 되는 것이다.
프레임 워크가 있다고 해서 인간의 노동이 완전히 사라지는 것은 아니다.
뉴스에서도 로봇이 인간을 대체 한다고 하지만, 그렇다고 해서
우리의 일자리가 완전히 사라지지는 않는 것 처럼.
사람만이 할 수 있는 일, 감정,상담,언어 등등 이런 것들도 프레임워크라고 볼 수 있겠다.
회원가입을 위한 DB 스키마를 구성했다.
숫자는 계속 증가하도록 했고
아이디, 비밀번호, 이름, 이메일 까지 받을 수 있다.
이제 DB랑 연결하는 동작을 수행해야한다.
흠 jsp였으면 DAO에서 드라이버 써서 연결 시켰겠지만..
프레임워크는 오히려 더욱 복잡하다고 한다.
간편하게, 분업화 하기 위해 뒤에서는 더욱 노력해야하는 것이다.
myBatis 라는 프레임워크가 있다.
DB랑 연결하는 소스들이 가득한 기능을 가지고 있지만, 겉으로는 코드가 많아 보이지 않는다.
다만 연결해야하는 xml들이 늘어난다.. ㅠ
잊지 말아야 하는 것이 우리는 지금 스프링이라는 프레임 워크 안에서 마이바티스라는 프레임워크를 사용하는
'액자식 구조'를 띄고 있는 것이다.
The MyBatis Blog
A blog about the the MyBatis data mapper framework.
blog.mybatis.org
블로그라니.. 작은 회사라지만 이정도의 프레임워크를 만드는 회사라면 대단하다...
https://github.com/mybatis/spring/releases
Releases · mybatis/spring
Spring integration for MyBatis 3. Contribute to mybatis/spring development by creating an account on GitHub.
github.com
이곳에서 zip 파일을 다운 받아 xml 파일에 추가 할 수 있는데,
친절한 강사님께서 이미 코드를 다 마련해두셨다.
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pack.spring</groupId>
<artifactId>basic</artifactId>
<name>Proj_Spring_Basic</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>15</java-version>
<org.springframework-version>5.2.22.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- database -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>15</source>
<target>15</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml 파일.
생각보다 코드가 잘 보인다.
java,스프링 코드도 들어가 있고 sql도 있다. 여기에 mybatis에서 받은 소스를 추가해주었다.
코드 작성하고 저장하고 프로젝트 우클릭해서 Run as - clean - 콘솔창에 "BUILD SUCCESS"가 뜨는지 보자
우리는 지금 스프링 프레임워크 중이자 마이바티스를 이용해 DB에 연결하는 동작을 수행중이다. 기억하자
폴더 많은 거 봐... 소스 폴더 ~ 안에 메인이 있는데 webapp 폴더 안에 WEB-INF가 있는데 스프링까지 들어가야해..
그러면 root-context.xml 파일이 나온다.
<!-- mysql dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/membership?serverTimezone=UTC&useSSL=false&useUnicode=true&char
acterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:/sqlmap/**/*_SQL.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
코드를 보면 , jdbc?? mysql?? 보던 글씨들이 나오고, 오 생성할또는 생성한 database 이름도 있고..
sql 입장 root 1234 도 들어 있고.. 아~ 접속하려고 하는 거구나 알게 된다.
근데 mapperLocations가 뭐지...?? *_SQL.xml 이라고 적혀 있는데
엄청 쉽다. 그냥 쿼리문 들어 있는 파일이다 _SQL.xml이라고 파일 형식이 정해져 있다는데
하도 파일이 많으니까 대문자로 쉽게 찾아보라고 SQL 이렇게 적어놓았나보다 ㅎㅎ
sqlSessionTemplate는 sqlSession 객체가 갖고 있는 DB 접속 정보와 매퍼 파일 위치를 알수 있다고...??
그렇구나~
자 또 한번 저장하고 프로젝트 우클릭 clean 해준다.
우리는 현재 스프링 프레임워크를 이용해서 DB 와 접속을 할 건데
DB 접속을 좀 더 쉽고, 나중을 생각하여 분업화가 잘 되도록
마이바티스라는 프레임 워크를 통해 DB를 연결하는 '코드'를 만드는 과정을 하고 있다.
이제 쿼리문이 들어갈 매퍼 파일을 또 ! 만들어줘야 한다.
쿼리문만 들어가면 되니까 좀 쉽겠지
정해진 src/main/resources/경로 에 sqlmap 폴더를 만든다.
그리고 xml파일을 만든다
이름은 database이름 그대로 가져왔다(가져와야 한다)
먼저 <mapper namespace> 는 그냥 고유 id 값. 이름이다.
xml 형제들이 많아지면 구별하기 위해 만들었다.
너의 이름은 멤버야 부르면 와야해
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">
</mapper>
이 코드만 붙여넣었고 나머지는 DB랑 연결해서 쿼리 전달 해야하니까 우리가 만들어야지.
<insert id="식별 값" parameterType="hashMap" useGeneratedKeys="true" keyProperty="member_id">
parameterType="hashMap" 은 쿼리에 적용하는 데이터를 키: 값 으로 처리하는 해쉬맵 형식을 의미한다.
어... 그러니까... 멤버의 자식이니까 이름:멤하나 성별은 "해쉬맵" 뭐 이런 식인가보네
useGeneratedKeys="true"와 keyProperty="member_id" 는
데이터 접속 객체(Data Access Object, DAO)에서 사용하기 위한 속성값입니다...??
설명은 이런데 그냥 그 sessionKey 같은 id 또는 name 값이라고 생각하면 될듯 하다.
<![CDATA[]]> : 이게 주석이란다. 주석치고 좀 더럽네
주석 없이 코드 작성하면 웹서버로 바로 실행되어서 주석으로 넘긴다고 한다.
insert into memList(테이블 이름) (넘길 컬럼이름들) values (#{uId})
#{ } 이름이 ${ } 랑 비슷하지만 엄연히 멤하나와 제하나는 다르다.
우리는 지금 스프링을 이용해 DB로 연결하는데 마이바티스라는 프레임워크를 사용해서 연결해서
데이터를 넘길거야. 데이터를 넘기는 방법은 매퍼 파일을 만들었으니 사용해야겠지
이제... 회원가입 DAO 클래스를 생성할 건데
전달 하고 받고 왕복 하니까 메서드가 있겠지? 그리고 리턴값도 있을거야.
jsp 에서는 bean을 사용했지만 여기서는 매퍼 파일 만든 거 쓸거고.
여기서 아주 혁신적인? @ 가 나오는데, 객체를 만들 필요가 없어
그냥 @Repository랑 @Autowired 만 사용하면 돼.
메서드를 만들어보자
public int insert(Map<String, Object> map) {
return this.sqlSessionTemplate.insert("member.insert", map);
}
int 인 이유는 return으로 돌아오는 값이 바로 row 갯수이기 때문이지.
jdbc에서도 cnt == 1 이런식으로 했으니까 여기서도 마찬가지야. 메서드 나오니까 반갑구만.
Map<String, Object> map 인수를 넘기는데, Map<String, Object>는 <컬럼이름,입력데이터> 를 의미해.
입력 데이터가 스트링일수도, 숫자일 수도 date 일수도 있어서 가장 높은 Object를 사용하는거지
return 이 좀 긴데, this.sqlSessionTemplate.insert("member.insert",map);
this는 MemberDao의 객체, sqlSessionTemplate은 root-context에서 bean id="★"이고
root-context에서 sql이랑 연결되어 있으니까 insert( 인수 ) 가 전달되는거야
member는 membership_SQL.xml에서 <mapper namespace="member"> 를 뜻하고
insert는
우리가 성별이 해쉬맵이라고 말했던 그 코드의 이름.
가장 중요하고 어려운 부분이지.
이제 오늘의 마지막, 서비스!
스프링에서 서비스는 클래스
컨트롤러와 DAO를 연결한대. 컨트롤러도 모델과 뷰를 연결하는 앤데, 또 필요한거야?
서비스는 인터페이스로 서브 클래스가 만들어 졌을 때 인터페이스를 참조하여 구현한다.
메서드에서 전달 받은 map 값을 insert 메서드가 실행되면 member.insert로 찾아가서 실행되는데
'코딩 해보자' 카테고리의 다른 글
c# 1일차 (0) | 2023.02.03 |
---|---|
스프링 부트를 사용해서 프로젝트 만들기 (0) | 2022.11.16 |
톰캣 서버 중복 (0) | 2022.10.19 |
스프링 설치 (0) | 2022.10.19 |
파이썬 연산자와 제어문 (0) | 2022.10.14 |
댓글