[Spring] 학생 관리 페이지 만들기

·2023년 11월 23일
0

Spring

목록 보기
2/9

Spring 은 프레임 워크다.
하는 방법을 익혀 그대로 사용하면 된다.

1. WEB-INF/lib

jar 파일 넣어 주기.
이제 jdbc와 jstl 도 사용해야 하므로 jar 파일을 같이 넣어 준다.
jar 파일
혹시 모르니까 블로그에도 압축 파일로 올려 놔야지.

2. 서버 등록해 주기

  <GlobalNamingResources>
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  	<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="10" maxIdle="5" maxWait="-1" name="jdbc/oracle" password="fin01" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="fin01"/>
  </GlobalNamingResources>

예전에는 다 아래에 일일이 추가를 해 줬는데 이제는 이쪽에 등록해 주고 아래에서 사용하는 걸로 한다.

      <Context docBase="studentSpring" path="/studentSpring" reloadable="true" source="org.eclipse.jst.jee.server:studentSpring">
      <ResourceLink name="jdbc/oracle" global="jdbc/oracle" type="javax.sql.DataSource"/>
      </Context></Host>

아래에서는 이렇게 이름 값만 받으면 되는 걸로.

3. DAO 변경

이제는 spring 이 알아서 다 해 주기 때문에 dao 는 별로 할 일이 없다. 알아서 받아오고 보내 주고 하기 때문에 우리는 그 기능을 사용만 하면 된다.

public class StudentDAO {
	
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

기본 설정.
jdbcTemplate 을 받아 준다. 그래서 아래에서 받아서 쓸 수 있도록 해 준다.

	public int insertStudent(StudentDTO dto) {
		String sql = "insert into student values(?,?,?)";
		Object[] values = new Object[] {dto.getId(), dto.getName(), dto.getCname()};
		int res = jdbcTemplate.update(sql, values);
		return res;
	}
	
	public int deleteStudent(String id) {
		String sql = "delete from student where id=?";
		int res = jdbcTemplate.update(sql, id);
		return res;
	}

추가 메서드들은 obj 에 담아서 jdbcTemplate으로 보내 준다.

그런데 리스트 등을 전달하고 싶다?

	class MyRowMapper implements RowMapper<StudentDTO>{
		@Override
		public StudentDTO mapRow(ResultSet rs, int arg1) throws SQLException {
			StudentDTO dto = new StudentDTO();
			dto.setId(rs.getString("id"));
			dto.setName(rs.getString("name"));
			dto.setCname(rs.getString("cname"));
			return dto;
		}	
	}
	private MyRowMapper mapper = new MyRowMapper();

Mapper를 통해 일반 중첩 클래스, 익명 중첩 클래스를 사용하여 myrowMapper 클래스를 사용

  1. 중첩 클래스 (Inner Class)
    • 일반 중첩 클래스 : 클래스 내부에 있는 클래스 (내부 클래스, 중첩 클래스)
      : OuterInnerInnerInner_Inner
      : 객체를 만들 때는 Outer01.Inner01 oi; oi = ot.new Inner01();
    • static 중첩 클래스 : 내부 클래스 이름 앞에 static이 붙은 클래스
      : 프로그램 시작 시 메모리에 미리 올라간다.
      따라서, 바깥 클래스 멤버 중 static 멤버가 아니면 사용 불가
      내부 클래스지만, 독립적으로 클래스를 운영하고자 할 때 사용
    • 지역 중첩 클래스 : 메서드 내부에서 만드는 클래스
      : 메서드가 실행이 될 때만 사용할 수 있다
      메서드 안에서 만들어지는 클래스라고 해서 지역 중첩 클래스라고 하고, 지역에 생성이 되므로
      같은 이름으로 여러개가 만들어질 수 있다.
      그래서 클래스명에 Outer$1Inner03.class 처럼 $ 뒤에 index를 붙혀 만든다
    • 익명 중첩 클래스 : 객체를 생성할 때, 메서드를 재정의하여 새로운 클래스를 만든 후,
      새로운 클래스로 객체를 만들고자 할 때 사용

이제부터 Mapper 가 자동으로 makeList를 만들어 준다.

	public List<StudentDTO> listStudent() {
		String sql = "select * from student";
		List<StudentDTO> list = jdbcTemplate.query(sql, mapper);
		return list;
	}

mapper를 사용해서 mapper의 객체를 전달하기만 하면 dao 는 끝.

4. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
	<servlet-name>springStudent</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>springStudent</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

xml 은 이렇게 간다. do로 끝나는 친구들을 springStudent-servlet 에 연결해 준다.
이제 servlet 은 xml 파일로 관리한다.

5. springStudent-servlet.xml

이 친구는 xml 파일이지만 기존 xml 파일처럼 other-xmlfile로 만드는 게 아니라 서블릿으로 직접 만들어 주어야 한다.

이 친구로 만들어 주어야 한다.

한 부분 한 부분 떼어내서 정리해 보자.

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="viewResolver" 
					class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>WEB-INF/student/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

이 부분은 앞에 굳이 쓰지 않도록 되게 접두사 접미사를 정해 주는 부분이다. 이게 있으면 귀찮게 폴더 명과 .jsp 를 다 써 주지 않아도 됨.

	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jdbc/oracle</value>
		</property>
		<property name="resourceRef">
			<value>true</value>
		</property>
	</bean>

DataSource 등록.
이름을 등록해 준다.

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource">
			<ref bean="dataSource"/>
		</property>
	</bean>
	
	<bean id="studentDAO" class="student.StudentDAO">
		<property name="jdbcTemplate" ref="jdbcTemplate" />
	</bean>

여기는 dataSource 를 이름으로 등록해 주는 부분. DAO 를 jdbcTemplate 으로 받는 부분도 여기 있다.

	<bean name="/student.do" class="student.StudentIndexController">
	</bean>
	
	<bean name="/insert_student.do" class="student.StudentInsertAbstractCommandController">
		<property name="studentDAO" ref="studentDAO"/>
		<property name="commandClass" value="student.StudentDTO"/>
		<property name="commandName" value="studentCmd"/>
	</bean>
	
	<bean name="/list_student.do" class="student.StudentListController">
		<property name="studentDAO" ref="studentDAO"/>
	</bean>
	
	<bean name="/delete_student.do" class="student.StudentDeleteAbstractCommandController">
		<property name="studentDAO" ref="studentDAO"/>
		<property name="commandClass" value="student.StudentDTO"/>
		<property name="commandName" value="studentCmd"/>
	</bean>
	
	<bean name="/find_student.do" class="student.StudentFindAbstractCommandController">
		<property name="studentDAO" ref="studentDAO"/>
		<property name="commandClass" value="student.StudentDTO"/>
		<property name="commandName" value="studentCmd"/>
	</bean>
	
</beans>

나머지는 student의 주소를 관리해 주는 부분이다.

6. Controller 들

📌 StudentListController

package student;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class StudentListController implements Controller {
	private StudentDAO studentDAO;
	public void setStudentDAO(StudentDAO studentDAO) {
		this.studentDAO = studentDAO;
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		List<StudentDTO> list = studentDAO.listStudent();
		ModelAndView mav = new ModelAndView("list", "listStudent", list);
		return mav;
	}

}

리스트 컨트롤러를 할 때는 Add를 눌러서 Controller implements 상속 받아 주기.

여기서는 ModelAndView 친구들로 객체 송수신을 한다.
ModelAndView mav = new ModelAndView("list", "listStudent", list);
이 파트에서 맨 앞이 가려고 하는 jsp 이름이 되는 거고, 뒤가 listStudent 이름으로 list를 보내는 것을 말한다.

📌 StudentFindController

find 에서는 Browse 를 해 준다.

그리고 Abstra... 를 implements 해 준다.

package student;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

public class StudentFindAbstractCommandController extends AbstractCommandController {

	private StudentDAO studentDAO;
	public void setStudentDAO(StudentDAO studentDAO) {
		this.studentDAO = studentDAO;
	}
	
	
	@Override
	protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object obj, BindException be)
			throws Exception {
		StudentDTO dto = (StudentDTO)obj;
		List<StudentDTO> list = studentDAO.findStudent(dto.getName());
		ModelAndView mav = new ModelAndView("list", "listStudent", list);
		return mav;
	}

}

그리고 dto 로 객체를 바로 받아서 getName() 을 해 준 다음 리스트를 넘겨준다.
그런데 쉽게 getParameter 로 받아도 됨.

📌 StudentDeleteController

package student;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

public class StudentDeleteAbstractCommandController extends AbstractCommandController {
	
	private StudentDAO studentDAO;
	public void setStudentDAO(StudentDAO studentDAO) {
		this.studentDAO = studentDAO;
	}
	
	@Override
	protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object obj, BindException be)
			throws Exception {
		StudentDTO dto = (StudentDTO)obj;
		int res = studentDAO.deleteStudent(dto.getId());
		
		ModelAndView mav = new ModelAndView("forward:message.jsp");
		if (res>0) {
			mav.addObject("msg", "학생삭제성공!! 학생목록페이지로 이동합니다.");
			mav.addObject("url", "list_student.do");
		}else {
			mav.addObject("msg", "학생삭제실패!! 학생관리페이지로 이동합니다.");
			mav.addObject("url", "student.do");
		}
		
		return mav;
	}

}

forward로 가는 법은 이렇게. 이렇게 하면 추가적인 메시지도 띄울 수 있음.

이렇게 하면 오늘의 Spring 정리 끝.

profile
자바 백엔드 개발자 개인 위키

0개의 댓글