728x90

 

기능이 실패했을 경우 예외처리

 <Checked Exception & Unchecked Exception>

  Checked Exception : 예외처리가 필수
  Unchecked Exception : 예외처리 선택

 Unchecked Exception의 조상 Runtime Exception
 Checked Exception의 조상은 Exception

예외 처리할 필요가 없게 extends를 Runtime Exception로 변경

package com.kh.Spring.member.model.exception;

public class MemberException extends RuntimeException {

	// Checked Exception & Unchecked Exception
	// 		Checked Exception : 예외처리가 필수
	// 		Unchecked Exception : 예외처리 선택
	
	// Unchecked Exception의 조상 Runtime Exception
	// Checked Exception의 조상은 Exception
	
	// 예외 처리할 필요가 없게 extends를 Runtime Exception로 변경
	
	public MemberException() {}
	public MemberException(String msg) {
		super(msg);
	}
	
}
728x90
반응형
728x90

 

초기세팅하면서 어떻게 스프링 프레임워크를 사용해야되는지 연습해보았다

 

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->

<!-- Basic DataSource 등록 -->	
	<!-- MVN Repository에서 commons-dbcp 검색해서 메이븐에 추가해야 사용가능 -->
	<!-- 이 DataSource를  SqlSession bean, DataSourceTransactionManager가 ref해서 사용하는 구조 -->
	<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close"> 
	<!-- destroy-method : 닫아주는 메소드로 close를 사용하겠다  -->
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" value="Spring"/>
		<property name="password" value="Spring"/>
	</bean>

	 
<!-- SqlSession 빈(bean) 등록 -->
	 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- mybatis라이브러리랑 mybatis Spring라이브러리를 미리 받아서 에러가 안드는 것 -->
	 	<property name="dataSource" ref="dataSource"/> <!-- 참고할거임. 데이터 소스를 참고할 것. id로 썼던 데이터소스를 의미  -->
	 	<!-- 마이바티스 컨피그에서 설정 정보를 설정했었음 -->
	 	<!-- 마이바티스 컨피그.xml파일을 읽어와야함 --> 
	 	<property name="configLocation" value="classpath:mybatis-config.xml"/>  
	 	<!-- classpath는 src/main/resource폴더를 의미함 --><!-- mybatis-config.xml 안만들었으니 만들러 ㄱㄱ -->
	 </bean> 
	 
<!-- Template 생성 -->
	<!-- SqlSessionFactoryBean를 ref함 -->
	 <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	 	<constructor-arg ref="sqlSession"/>  <!-- 매개변수 있는 생성자. 위의 1번 방법에 있는 그것-->
	 </bean>
 <!-- transactionManager : 트랜잭션 집어넣을 수 있게 -->
	 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	 	<property name="dataSource" ref="dataSource"/>
	 </bean>
	 
 <!-- 파일업로드 : multipartResolver -->
	 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	 	<property name="maxUploadSize" value="100000000"/>	<!-- value : 용량 정하기 -->
		<property name="maxInMemorySize" value="100000000"/>
	 </bean>
	 
	 
	 	 		
</beans>

 

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="prac.prac.practice" />
	
	
	
</beans:beans>

 

컨트롤러

package prac.prac.practice.board.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import prac.prac.practice.board.model.service.BoardService;

@Controller
public class BoardController {

	
	@Autowired
	private BoardService boardService;
	
}

서비스/서비스Impl

package prac.prac.practice.board.model.service;


public interface BoardService {

}

///////////////////////////////////////////////

package prac.prac.practice.board.model.service;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import prac.prac.practice.board.model.dao.BoardDAO;

@Service("boardService")
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardDAO boardDAO;
	
	@Autowired
	private SqlSessionTemplate SqlSession;

}

 

DAO

package prac.prac.practice.board.model.dao;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;

@Repository("boardDAO")
public class BoardDAO {

	
	
}

 

 

728x90
반응형
728x90

 

 

${ bdelete }

84번째 라인 ${ bdelete } 태그가 73번째 라인 var=”bdelete”를 가져다 쓰는거고 bdelete의 value속성은 url을 담고있음

삭제하기 버튼을 누르면 84번째 라인 ${ bdelete } 가 실행되고 var=”bdelete”가 호출되고 var=”bdelete”와 이어져있는 url인 bdelete.bo가 연결된 콘트롤러로 연결됨.

이때 74번째 라인 <c:param> 안에 pk역할을 하는 name=”bId”를 콘트롤러에서 데이터를 받게되면 ${ board.boardId } 를 받는데 db의 boardId 컬럼은 게시글 번호이므로 1,2,3,4 이런식으로 int값이 최종적으로 컨트롤러에 들어가게된다

삭제하기 버튼 누르면 bdelete쪽으로 넘길 때

<c:param name="bId" value="${ board.boardId }"/> 이부분을 가지고 넘김

 

@RequestMapping("bdelete.bo")
public String deleteBoard(@RequestParam("bId") int bId, 
						  @RequestParam("renameFileName") String renameFileName, HttpServletRequest request) {
	// boardDetailView
	// 어디서 접근해서 삭제할지도 지정해야하니 HttpServletRequest도 추가

	if(!renameFileName.equals("")) { // renameFileName이 비어있지 않다면
		deleteFile(renameFileName, request); // renameFileName을 넘겨준다, 어디서 삭제할 것인가:request
	}
	int result = bService.deleteBoard(bId);

 

728x90
반응형
728x90

 

MyBatis 설정 정보 파일 세팅

1)class의 alias(별칭) 설정

2)DB 연결 설정

3)sql 구문 경로 설정

 

 <MyBatis Configuration파일의 태그 순서>

설정 파일의 최상위 태그인 <configuration></configuration> 안에

태그들이 아래의 순서대로 있어야 에러없이 잘 작동한다


 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?, reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)

 

<?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>
	<properties resource="/driver.properties"></properties>
	<environments default="development"> <!-- default 속성값 : environments 아래 하위 태그인 연결할 환경(environment)이 많은데 어떤 녀석을 기본값으로 부를지 지정 -->

		<environment id="development"> <!-- id속성 : environment 구분 -->  
			<transactionManager type="JDBC"/>  <!-- 트랜잭션(커밋,롤백)을 누가 관리할 것인지 설정 -->
			<dataSource type="POOLED"> <!-- ConnectionPool 사용 여부 -->

			 	<!-- 2)외부파일 로드 방식 -->
			 	<property name="driver" value="${driver}"/> <!-- el형식. jsp에서 쓴 el이랑 똑같은 el은 아닌 걸 주의. 단순 expression language일 뿐 함수 사용이나 그런게 안된다는 의미 -->
			 	<property name="url" value="${url}"/>
			 	<property name="username" value="${username}"/>
			 	<property name="passwoard" value="${password}"/> 
			 	<!-- 파일들을 읽어올 수 있게 properties태그 설정을 밖에 해야함 -->
			</dataSource>
		</environment>
	</environments>

</configuration> <!-- 다큐먼트 타입을 안쓰면 자동완성에 컨피겨 안뜨고 독타입부터 쓰라고 추천뜸  -->

 

728x90
반응형
728x90

Filter

이클립스 new에서 Filter 항목 클릭하면 자동생성됨

인코딩 코드 추가: request.setCharacterEncoding("UTF-8");

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		request.setCharacterEncoding("UTF-8");
		
		chain.doFilter(request, response);
	}

 

추가로 필터는 Annotation이 @WebFilter이다

 

Exception

1) 클래스생성

2) 클래스 기본생성자 생성

public MemberException() {}

3) 예외처리해줄 메소드 생성 + super()

	public MemberException(String msg) {
			super (msg);
	}

 

 

Filter

package common;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class CommonFilter
 */
@WebFilter("/CommonFilter")
public class CommonFilter implements Filter {

    /**
     * Default constructor. 
     */
    public CommonFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	
	
	
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		request.setCharacterEncoding("UTF-8");
		
		chain.doFilter(request, response);
	}

	
	
	
	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

 

 

Exception

package member.model.vo;

public class MemberException extends Exception {
	public MemberException() {}
	public MemberException(String msg) {
			super (msg);
	}
}

 

728x90
반응형
728x90

 

1) import static common.Template.*;

Template.java에서 만든 db연결 기능을 끌어와 쓸 것

 

2) SqlSession session = getSqlSession()

db 연결

 

3) controller, dao 호출 및 데이터 전송

public class MemberService {
	public Member selectMember(Member m) {
		
		SqlSession session = getSqlSession();
		
		Member member = new MemberDAO().selectMember(session, m);
		
		session.close();
		
		return member;
	}
}


	public void insertMember(Member m) throws MemberException {

		SqlSession session = getSqlSession();
		
		new MemberDAO().insertMember(session, m);
		
		// 인서트가 잘안됬으면 롤백해야함. 롤백은 dao에서 해야함. 제대로 잘안됬으면 익셉션 발생할거고, 서비스에서 나눠봤자 의미x
		session.commit();
		session.close();
		
	}

 

728x90
반응형
728x90

 

1)기본 생성자 생성

public Template[] {}

 

2)public static SqlSession getSqlSession() 메소드 생성

 

3) SqlSession session = null;

 

4)MyBatis 설정파일 읽어오기

InputStream으로 마이바티스 환경설정 파일 mybatis-config.xml 로드

InputStream stream = Resources.getResourceAsStream("/mybatis-config.xml");

인풋스트림이 스트림이니 getResource할 때 AsStream으로 읽어와라는 의미

Resources.은 클래스임. 대문자 시작은 클래스.

Resources라는 클래스를 이용해서 resources폴더에 접근할 수 있게 되는 것

 

5) SqlSessionFactoryBuilder 클래스(객체) 생성

 

 

6)SqlSessionFactory 클래스(객체) 생성

5번에서 생성한 SqlSessionFactoryBuilder에 4번에서 로드한 mybatis-config.xml을 .bulid()로 연결

InputStream stream = Resources.getResourceAsStream("/mybatis-config.xml");

SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = **ssfb.build(stream)**;
session = ssf.openSession(false); // false : 자동 커밋 하지않겠다는 의미 // 이중안전장치로 false 세팅함

 

 

7) SqlSession에 여태 생성하고 받아온 모든 데이터 넣기

SqlSessionFactory에 담아둔 설정파일 데이터와 함께 openSession()을 생성하면서 SqlSession 변수인 session에 넣어준다

InputStream stream = Resources.getResourceAsStream("/mybatis-config.xml");

SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); // 객체생성
SqlSessionFactory ssf = ssfb.build(stream); // 생성한 SqlSessionFactoryBuilder 객체(클래스)와 InputStream으로 읽어온 mybatis-config.xml
**session** = ssf.**openSession**(false);

 

※ close, commit, rollback 메소드는 안써도 MyBatis에서 처리함

 

 

전체코드

package common;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Template {
	
	public Template() {} // 기본 생성자
	
	public static SqlSession getSqlSession() {
		
		
		SqlSession session = null;
		
			try {
				// MyBatis 설정파일 읽어오기
				InputStream stream = Resources.getResourceAsStream("/mybatis-config.xml");
				
				SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); // 객체생성
				SqlSessionFactory ssf = ssfb.build(stream); // 생성한 SqlSessionFactoryBuilder 객체(클래스)와 InputStream으로 읽어온 mybatis-config.xml
				session = ssf.openSession(false); // false : 자동 커밋 하지않겠다는 의미 // 이중안전장치로 false 세팅함
				// * 위의 세줄 한줄로 단축 가능

				// close, commit, rollback 메소드는 안써도 마이바티스에서 처리해줌
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			return session;
	}

	
}

 

728x90
반응형
728x90

회원가입, 조회, 내 정보 보기, 수정, 탈퇴

 

db랑 다르게 쿼리문 맞쳤다는 세미콜론 안들어감

<?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="memberMapper">
	<!-- 회원가입 : insert태그 -->
	<insert id="insertMember" parameterType="Member"> <!-- parameterType : 쿼리에 전달될 데이터의 타입 지정 -->
		insert into member
		values (#{userId}, #{userPwd}, #{userName}, #{nickName}, #{email}, #{birthDay}, #{gender}, #{phone}, #{address}, sysdate, sysdate, default)
	</insert>

	<!-- 내정보보기 수정 -->
	<update id="updateMember" parameterType="Member">
			update member
			set user_name = #{userName}, nickName = #{nickname}, email = #{email}, birthDay = #{birthDay},
				gender = #{gender}, phone = #{phone}, address = #{address}
			where user_id = #{userId}
	</update>
	
	
	<!-- 비번 수정 -->
	<update id="updatePwd" parameterType="java.util.HashMap"> <!-- parameterType="hashMap"도 가능. 마바 내장별칭 때문 -->
		update member
		set user_pwd = #{newPwd} 
		where user_id = #{id} and user_pwd = #{oldPwd}
	</update>
	
	
	<!-- 회원탈퇴 -->
	<update id="deleteMember" parameterType="string"> <!--string : 마이바티스 내장 별칭 string==String  -->
		update member
		set status = 'N' 
		where user_id = #{userId}
	</update>


</mapper>

 

728x90
반응형
728x90
728x90
반응형
728x90
728x90
반응형

+ Recent posts