Maven: 라이브러리 관리자 (Spring)
Spring project
Springboot project
(Dynamic X)

(gradle: 얘도 관리자
android project
springboot project)

프로젝트 생성 시 Artifact id = 프로젝트명
Group id = 도메인 역순으로 입력
index.jsp 파일이 오류날 경우, 톰캣 라이브러리를 추가함
Build Path-Configure Build Path - Libraries - Add Library - Server Runtime - 톰캣 선택 후 finish - Apply
JRE 라이브러리 1.8로 바꾸기
properties - 좌측에 Project Facets - 체크되어있는 java 의 버전을 1.8로 변경!



* maven project 구조
maventest - src - main - java   <- Controller, Service, DTO, DAO
  ★  - resources <-MyBatis 환경설정 파일, SQL문 파일(.xml)
       - webapp <- View 페이지
 -WEB-INF - web.xml <-project 환경설정 파일
         - pom.xml <- Maven 환경설정 파일


pom.xml 
dependency (의존 라이브러리) : cos, oracle, mysql, mybatis, jstl 
기본적으로 junit만 dependency로 받고 있는 상태인데 나중에 라이브러리를 더 추가할 수 있음 -> 추가하면 공식적인 원격저장소에서 컴퓨터 상 로컬저장소로 다운받게 됨 -> 그 과정이 제대로 진행되지 않으면 pom.xml에 오류가 남

※ 로컬저장소 위치
preferences - 좌측 Maven-user settings -> local repository에서 확인
repository 다운받아서 저 경로에 덮어쓰면 됨

의존 라이브러리 추가: http://mvnrepository.com에서 검색해 dependency에 추가할 수 있음
1. cos 


05Nov2002 눌러서 Maven 선택했을 때 뜨는 dependency 코드 복사해서 pom.xml의 dependencies 안에 붙임


2. oracle
얘는 공식저장소에서 받으면 뭐 오류가 자꾸 난다고... 해서 ppt에 있는걸 복붙
근데 이거 붙여도 오류남; 오라클 라이브러리가 로컬로 제대로 다운받아지지 않았기 때문...
바로 이런 때 이미 받은 레파지토리를 덮어씌워야 한다...
이클립스 끄고 로컬에 있는 레파지토리 싹 지우고 받은거 복붙!

Download sources and javadoc has encountered a problem
could not download sources or javadoc -> 이거는 properties-maven-체크하기



난 저래도 안돼서 구글링..... 나는 artifactId-11.2.0.3.jar 을 찾을 수 없다는 오류가 떴음
아래 코드로 바꿔보니 해결됨!!!!!!! 엑스자도 없고 index도 문제없이 실행됨!!!

<dependencies>
  <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
  </dependency>
</dependencies>

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



메이븐 프로젝트는 war파일로 export하면 나중에 import할때 다이나믹 프로젝트로 풀리게 된다

 ---> 얘는 war로 만들면 안됨. 최종적으로 배포할 때만 war파일로 해야!
다른 때는 그냥 프로젝트 통째로 zip으로 압축해야 함
얘를 가져올때
import - General - Existing projects into Workspace - 디렉토리 선택하면 아래 projects 칸에 프로젝트가 뜸 - 그걸 체크하고 연다!



*MyBatis 연동하기
JDBC, DBCP, ORM프레임워크
ORM -> 테이블 컬럼명과 변수명을 동일하게 설정할 경우 자동으로 맵핑이 일어나게 함 -> 소스코드를 줄여준다!

plugin 설치
Help -> Marketplace -> orm 검색 -> MyBatipse 1.2.5 install -> 추가하면 resource에 MyBatis 환경설정 파일, SQL문 파일(.xml)을 만들 수 있게 됨.
설치 후 resources - new - other.. - MyBatis - MyBatis XML Mapper-file name을 mapper(.xml) 설정 후 finish! (이름 달라도 문제 없음 확장자도 자동으로 붙음!!)
-----> 지금은.. MyBatis 환경설정 파일을 만들 수 없는 것 같다! sql문 파일만 되는듯!
아래 캡처처럼... 저 안에 sql문을 넣는 것임



*MyBatis 프로젝트 import하기
zip파일 압축 풀고 file - import - General - Existing Projects into Workspace
폴더 선택하고 options에 Copy projects into workspace 체크한뒤 finish!

불러오면 resources의 xml 파일들에 에러가 난 상태일 것임 -> 클래스가 정의되어있지 않아서 그래!
(원래 mybatis 추가하면 db.properties랑 mybatis-config.xml(환경 설정 파일) 파일도 생겨야 하는데 이젠 mapper.xml만 만들 수 있나봄)

 


* 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> : db.properties를 불러옴
<properties resource="db.properties" />

<typeAliases> : type은 패키지부터 클래스명을 명시, alias=별칭명
---> 긴 걸 별칭으로 줄여서 쓰기 위해 사용!
---> 클래스가 여러 개면 다 추가해줘야 함
<typeAlias type="#package.#modelname" alias="#modelname"></typeAlias>

<environments default="development"> : 연결 환경설정 부분..
내부 멤버변수(property)의 value들은 db.properties에 있고 그걸 가져와 변수에 저장
---> 저장하는 이유! mySQL이랑 oracle의 값이 서로 다르기 때문에 이렇게 불러오면 그db파일만 바꿔줘도 바로 적용 가능함!


<mappers> : 맵핑할 mapper.xml파일 불러옴
<mapper resource="#package/#mapper.xml" />

 


* mapper.xml


<mapper namespace="#package.#mapperinterfacename"> : root elements
--> 얘가 루트라서 환경설정파일에서도 mapper로 가져온 것
아래로 아까 봤던... select insert update delete의 sql문 형태가 정의되어있음
+resultMap: 파라미터 정의
※ namespace= <- 맵핑을 구분하는 논리적인 영역. 맵퍼 파일이 많아 각 맵퍼에 겹치는 id를 가진 sql문이 존재하게 될 때, 각 변수를 구분하는 역할을 하게 됨!
※ 한 루트 엘레멘트 내 각각의 id값은 서로 다르게 설정해 구분할 수 있게 해야 함!
---> 나중에 dao에서 값을 받아올 때 id를 이용해 sql문을 가져와야 하기 때문!

<select id="getSomething" parameterType="int" resultType="#package.#modelname">
id="getSomething" : 매핑할 sql문을 불러오기 위한 id
parameterType="int" 값을 받을 때 그 값의 타입 (dto도 당연히 들어갈 수 있다)
resultType="#package.#modelname" : select문에서 값을 돌려줄 때 값의 타입
---> return해주는 값의 타입이기 때문에 select에서만 사용함!

<resultMap type="#modelname" id="YourResultSet">
---> select로 불러오는 값의 변수(컬럼)와 CRUD할때 변수(컬럼)이 서로 다를 때 맞춰주기 위해 이 안에 정의해놓음
<id property="param1" column="columnname1" />
<result property="param2" column="columnname2" />
---> select로 column값을 받았고 그 값을 param에 넣어서 아래 insert.. 이런데에 들어있는 param으로 넘겨줄 수 있다



Mybatis는 기존 dao를 처리하던 service class에서 dao부분이 xml로 분리된 형태!
MemberDAO에서 SqlSession 인터페이스를 이용해 sql문 처리 요청
-> mybatis-config.xml에서 환경설정(서버 연결)
-> member.xml(매퍼)에서 sql문 실행
-> 실행 후 select는 리턴값을 받을것이고 CRUD는 정상 동작 시 1을 리턴하게 될 것. 이걸 DAO가 받아서 넘겨주게 된다!


*DAO
SqlSession 객체 생성

private SqlSession getSession() {
   SqlSession session=null;
   Reader reader=null;

   try {
      reader = Resources.getResourceAsReader("mybatis-config.xml");      //환경설정 읽어옴
      SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(reader);  //데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 객체
      session = sf.openSession(true);   // auto commit  //세션 연결
   } catch (IOException e) {
      System.out.println(e.getMessage());
   }
   return session;
}

이렇게 getSession 만들어놓고 아래에선 session에 불러오기만 하면 됨 (getConnection과 같은 쓰임)

 


- SqlSession 메소드
insert    -> int insert()
update -> int update()
delete   -> int delete()
select    -> Object selectOne() : 검색결과가 1개
                -> List selectList() : 검색결과가 n개


*Model1으로 연습해보자
create table member22 (
   id varchar2(10) primary key,
   password varchar2(10)
);  ----> 컬럼값을 변수(DTO)와 일치하게 해야 자동으로 매핑할 수 있음! 간단해짐!

1. 가입
joinForm : id, password 입력 후 joinPro.jsp에 get방식으로 전송
※이 때, name을 DTO(+컬럼)과 일치시켜야 함 (중요)

joinPro : useBean으로 DTO 객체 생성 후 setProperty로 id, password를 DTO에 담음
<jsp:useBean id="mem" class="model.Member"/>
<jsp:setProperty property="*" name="mem"/>
+) DAO 객체 생성해 insert(dto)를 불러옴
MemberDao md = new MemberDao();
int result = md.insert(mem);

DAO.java
public int insert(Member member) {
   int result = 0;
   SqlSession session=null;
   try { 
      session = getSession();    //세션 연결
      result = session.insert("insert", member);
       //xml의 id="insert"로 dto(member)를 보낸다
   } catch (Exception e) {
   System.out.println(e.getMessage());
   }
   return result;
}

member.xml
<insert id="insert" parameterType="member">
   insert into member22 values (#{id}, #{password})
</insert>   //member의 id, password가 자동으로 맵핑되어 sql문 실행됨


 #{id}=member.getId()  #{password}=member.getPassword()

DAO.java : 실행 성공 시 result=1, 실패 시 result=0 --> 결과값 리턴(return result)

joinPro : result 값에 따라 if문 출력


2. 로그인
loginForm : id, password 입력 후 loginPro.jsp에 get방식으로 전송 (name과 DTO 일치)

loginPro.jsp
useBean으로 DTO 셋팅
<jsp:useBean id="mem" class="model.Member"/>
<jsp:setProperty property="*" name="mem"/>
DTO로 chk(dto)불러옴
MemberDao md = new MemberDao();
int result = md.chk(mem);

DAO.java
session = getSession(); 
Member mem = (Member) session.selectOne("select", member.getId());
   //selectOne ---> 결과가 하나일 경우 사용
selectOne은 object형이라 보통 다운캐스팅으로 형변환시켜주는 게 원칙이지만, 안 써도 내부적으로 알아서 형변환시켜준다!

member.xml
<select id="select" parameterType="String" resultType="member">
   select * from member22 where id = #{id}
</select>  //member의 id가 자동으로 맵핑되어 sql문 실행되고 member로 리턴

DAO.java : member(dto)로 리턴받은 값을 입력받은 값과 비교!
///아이디 존재하지 않을 경우 result=0
if (mem.getId().equals(member.getId())) {   //아이디 존재함 =-1
   result = -1;
   if (mem.getPassword().equals(member.getPassword())) {  //비번도 일치함=1
      result = 1;
   }
}
return result;

loginPro : result 값에 따라 if문 출력


3. 로그아웃
logout.jsp : session.invalidate(); 세션공유된거 다 삭제하고 location.href로 창 넘김


+ Recent posts