반응형
  • Spring : Java Enterprise Application 개발에 사용되는 Application Framework. 개발을 빠르고 효율적으로 할 수 있도록 Application의 바탕이 되는 틀과 공통프로그래밍 모델, 기술, API를 제공
  • 특징
    • 스프링은 종속객체주입이라는 기술을 통해 낮은 결합도를 유지할 수 있음.
    • AOP를 이용하여 객체지향만이 아닌 관심지향 기법을 활용.
    • EJB 기능을 대체 할 수 있음, 트랜젝션 처리를 위한 일관된 방법을 제공.
    • 레이어간 연결이 interface로 이루어지기 때문에 interface 생성이 필요.
    • 다양한 프레이워크와의 통합
  • MVC 모델에서 커버하는 부분: Controller 지원.
  • 실행 순서(실행구조):
    • web.xml의 등록된 DispatcherServlet를 통해서 요청에 대한 진입.
    • DispatcherServlet은 Client로부터 들어온 URL을 HandlerMapping 라는 곳으로 전송 후 URL을 분석해서 알맞은 Controller 이름을 다시 DispatcherServlet으로 보냄
    • HandlerMapping이라는 것을 통해서 실행될 Controller의 이름을 입력받은 DispatcherServlet은 전달받은 Controller를 실행시킴. 이렇게 실행된 Controller는 스프링에서 제공하는 ModelAndView 객체에 뷰 페이지에 전달할 객체와 View Page 이름 정보를 담고 DispatcherServet으로 보냄
    • ViewResolver를 통해서 보여 질 View페이지를 탐색한 후 View페이지를 보여줌
반응형

'2020 > 신입 개발자 면접 질문 모음' 카테고리의 다른 글

iBatis 란  (0) 2020.03.15
DI 와 AOP의 대해 설명하시오.  (0) 2020.03.12
Struts2  (0) 2020.03.12
ERP? Framework?  (0) 2020.03.11
URI와 URL의 차이  (0) 2019.12.09
블로그 이미지

꽃꽂이하는개발자

,
반응형

이전 글에 이어서 작성해보도록 하겠습니다.

실습에 필요한 파일들을 다음과 같이 준비합니다.

MemberVO 를 작성하겠습니다.

package com.spring.member.vo;

import java.sql.Date;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;

	public MemberVO() {
		
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
	
	


}

1. MemberControllerImpl 클래스를 다음과 같이 구현합니다. 자신의 속성 memberService에 설정 파일에서 생성된 memberService 빈을 주입하기 위해 반드시 setter를 구현해야 합니다.

package com.spring.member.controller;

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

import org.springframework.web.servlet.ModelAndView;

public interface MemberController {
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;

}
package com.spring.member.controller;

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.multiaction.MultiActionController;

import com.spring.member.service.MemberService;

public class MemberControllerImpl extends MultiActionController implements MemberController {
	private MemberService memberService;
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String viewName = getViewName(request);
		List membersList = memberService.listMembers();
		ModelAndView mav = new ModelAndView(viewName);
		mav.addObject("membersList", membersList);
		return mav;
	}
	
	
	private String getViewName(HttpServletRequest request) throws Exception {
		String contextPath = request.getContextPath();
		String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
		if (uri == null || uri.trim().equals("")) {
			uri = request.getRequestURI();
		}

		int begin = 0;
		if (!((contextPath == null) || ("".equals(contextPath)))) {
			begin = contextPath.length();
		}

		int end;
		if (uri.indexOf(";") != -1) {
			end = uri.indexOf(";");
		} else if (uri.indexOf("?") != -1) {
			end = uri.indexOf("?");
		} else {
			end = uri.length();
		}

		String fileName = uri.substring(begin, end);
		if (fileName.indexOf(".") != -1) {
			fileName = fileName.substring(0, fileName.lastIndexOf("."));
		}
		if (fileName.lastIndexOf("/") != -1) {
			fileName = fileName.substring(fileName.lastIndexOf("/"), fileName.length());
		}
		return fileName;
	}
}

2. MemberServiceImpl 클래스에서는 자신의 속성인 memberDAO에 빈을 주입하기 위해 setter를 구현합니다.

package com.spring.member.service;


import java.util.List;

import org.springframework.dao.DataAccessException;

public interface MemberService {
	public List listMembers() throws DataAccessException;
}
package com.spring.member.service;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.spring.member.dao.MemberDAO;

public class MemberServiceImpl implements MemberService {
	private MemberDAO memberDAO;

	public void setMemberDAO(MemberDAO memberDAO) {
		this.memberDAO = memberDAO;
	}

	@Override
	public List listMembers() throws DataAccessException {
		List membersList = null;
		membersList = memberDAO.selectAllMembers();
		return membersList;
	}

}

3. MemberDAOImpl 클래스에서는 자신의 속성 jdbcTemplate에 dataSource 빈을 주입하기 위해 setter를 이용합니다.

 

package com.spring.member.dao;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.spring.member.vo.MemberVO;


public interface MemberDAO {
	public List selectAllMembers() throws DataAccessException ;
	public int addMember(MemberVO memberVO) throws DataAccessException ;

}
package com.spring.member.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.spring.member.vo.MemberVO;


public class MemberDAOImpl implements MemberDAO {
	private JdbcTemplate jdbcTemplate;
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List selectAllMembers() throws DataAccessException {
		String query = "select id,pwd,name,email,joinDate" + " from t_member " + " order by joinDate desc";
		List membersList = new ArrayList();

		membersList = this.jdbcTemplate.query(query, new RowMapper() {
			public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
				MemberVO memberVO = new MemberVO();
				memberVO.setId(rs.getString("id"));
				memberVO.setPwd(rs.getString("pwd"));
				memberVO.setName(rs.getString("name"));
				memberVO.setEmail(rs.getString("email"));
				memberVO.setJoinDate(rs.getDate("joinDate"));
				return memberVO;
			}
		});
		return membersList;
	}

	@Override
	public int addMember(MemberVO memberVO) throws DataAccessException {
		String id = memberVO.getId();
		String pwd = memberVO.getPwd();
		String name = memberVO.getName();
		String email = memberVO.getEmail();
		String query = "insert into t_member(id,pwd, name,email) values  ("
		                 + "'" + id + "' ,"
	 	                 + "'" + pwd + "' ,"
		                 + "'" + name + "' ,"
		                 + "'" + email + "') ";
		System.out.println(query);
		int result = jdbcTemplate.update(query);
		System.out.println(result);
		return result;
	}

}

4. listMembers.jsp에서는 조회한 회원 정보를 표시해줍니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />

<%
  request.setCharacterEncoding("UTF-8");
%>    


<html>
<head>
<meta charset=UTF-8">
<title>회원 정보 출력창..</title>
</head>
<body>
<table border="1"  align="center"  width="80%">
    <tr align="center"   bgcolor="lightgreen">
      <td ><b>아이디</b></td>
      <td><b>비밀번호</b></td>
      <td><b>이름</b></td>
      <td><b>이메일</b></td>
      <td><b>가입일</b></td>
   </tr>
   
 <c:forEach var="member" items="${membersList}" >     
   <tr align="center">
      <td>${member.id}</td>
      <td>${member.pwd}</td>
      <td>${member.name}</td>
      <td>${member.email}</td>
      <td>${member.joinDate}</td>
      
    </tr>
  </c:forEach>   
</table>
<a  href="${contextPath}/member/memberForm.do"><h1 style="text-align:center">회원가입</h1></a>
</body>
</html>

저의 db에 있는 회원 목록이 표시되네요

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

이번 글에서는 회원 정보 입력창에서 회원 정보를 입력한 후 요청 시 전송된 회원 정보를 표시해보겠습니다.

 

1. 회원 정보를 표시하기 위해 action-servlet.xml을 다음과 같이 수정합니다. 회원 정보 요청 URL에 대해 처리할 메서드를 추가한 후 /test/memberInfo.do로 요청하면 요청명과 같은 memberInfo() 메서드를 호출합니다.

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- 
	  id가 simpleUrlController인 빈을 생성합니다. 
	<bean id="simpleUrlController" class="com.spring.ex01.SimpleUrlController" />
	 SimpleUrlHandlerMapping 클래스를 이용해 /test/index.do로 요청 시 simpleUrlController를 호출하도록 매핑합니다. 
	<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	  <property name="mappings">
	  	<props>
	  	  <prop key="/test/index.do">simpleUrlController</prop>
	  	</props>
	  </property>
	</bean>
 -->	
 
 <!-- 컨트롤러에서 ModelAndView 인자로 뷰이름이 반환되면 InternalResourceViewResolver의 프로퍼티스 prefix 속성에 지정된 /test폴더에서
 	ModelAndView 인자로 넘어온 뷰 이름에 해당되는 jsp를 선택해 DispatcherServlet으로 보냅니다.
  -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
	<property name="prefix" value="/test/" />
	<property name="suffix" value=".jsp" />
</bean>
 
<bean id="userUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 	<property name="mappings">
 		<props>
 			<prop key="/test/*.do">userController</prop>
 		</props>
 	</property>
 </bean>
 	
<bean id="userController" class="com.spring.ex02.UserController">
	<!-- methodNameResover 프로퍼티에 userMethodNameResolver를 주입해서 지정한 요청명에 대해
		직접 메서드를 호출하게 합니다. -->
	<property name="methodNameResolver">
		<ref local="userMethodNameResolver" />
	</property>
</bean>

<!-- PropertiesMethodNameResolver를 이용해 /test/login.do로 요청하면 userController의 login 메서드를 호출합니다. -->
<bean id="userMethodNameResolver"
	class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" >
	<property name="mappings">
		<props>
			<prop key="/test/login.do">login</prop>
			<!-- URL 요청명과 메서드 이름을 동일하게 하여 회원 정보를 요청합니다. -->
			<prop key="/test/memberInfo.do">memberInfo</prop>
		</props>
	</property>
</bean>

</beans>

2. UserController 클래스를 다음과 같이 수정하겠습니다. 회원 가입창에서 전송된 회원 정보를 가져온 후 ModelAndView를 이용해 회원 정보를 바인딩하여 memberInfo.jsp로 전달하는 memberInfo() 메서드를 추가합니다.

 

package com.spring.ex02;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

// 설정 파일의 userMethodNameResolver 프로퍼티를 사용하려면 반드시 MultiActionController를 상속 받아야 합니다.
public class UserController extends MultiActionController{
	public ModelAndView login(HttpServletRequest request, HttpServletResponse response) 
			throws Exception{
			String userID ="";
			String passwd ="";
			ModelAndView mav = new ModelAndView();
			request.setCharacterEncoding("utf-8");
			userID=request.getParameter("userID");
			passwd=request.getParameter("passwd");
			
			//ModelAndView에 로그인 정보를 바인딩합니다.
			mav.addObject("userID", userID);
			mav.addObject("passwd", passwd);
			//ModelAndView 객체에 포워딩할 JSP 이름을 설정합니다.
			mav.setViewName("result");
			return mav;
		}
	public ModelAndView memberInfo(HttpServletRequest request, HttpServletResponse response) throws Exception{
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView();
		String id = request.getParameter("id");
		String pwd= request.getParameter("pwd");
		String name= request.getParameter("name");
		String email=request.getParameter("email");
		
		mav.addObject("id", id);
		mav.addObject("pwd", pwd);
		mav.addObject("name", name);
		mav.addObject("email", email);
		
		mav.setViewName("memberInfo");
		return mav;
	}
}

3. 회원 가입창에서 회원 정보를 입력한 후 /test/memberInfo.do로 요청하도록 action 속성을 설정합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<c:set var="contextPath" value="${pageContext.request.contextPath }" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<style>
	.text_center{
    text-align:center;
    }
</style>

</head>
<body>
<form method="post"   action="${contextPath}/test/memberInfo.do">
	<h1  class="text_center">회원 가입창</h1>
	<table  align="center">
	   <tr>
	      <td width="200"><p align="right">아이디</td>
	      <td width="400"><input type="text" name="id"></td>
	   </tr>
	   <tr>
	      <td width="200"><p align="right">비밀번호</td>
	      <td width="400"><input type="password" name="pwd"></td>
	    </tr>
	    <tr>
	       <td width="200"><p align="right">이름</td>
	       <td width="400"><p><input type="text" name="name"></td>
	    </tr>
	    <tr>
	       <td width="200"><p align="right">이메일</td>
	       <td width="400"><p><input type="text" name="email"></td>
	    </tr>
	    <tr>
	       <td width="200"><p>&nbsp;</p></td>
	       <td width="400"><input type="submit" value="가입하기"><input type="reset" value="다시입력"></td>
	    </tr>
	</table>
	</form>
</body>
</html>

4. memberInfo.jsp를 다음과 같이 작성합니다.

  UserController의 memberInfo() 메서드에서 바인딩해 넘어온 회원 정보를 출력합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"%>
    
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보 출력창</title>
</head>
<body>
<table border="1" align="center" width="100%" >
   <tr align=center   bgcolor="lightgreen">
      <td ><b>아이디</b></td>
      <td><b>비밀번호</b></td>
      <td><b>이름</b></td>
      <td><b>이메일</b></td>
   </tr>
   <tr align="center">
      <td>${id}</td>
      <td>${pwd}</td>
      <td>${name}</td>
      <td>${email}</td>
    </tr>
</table>
</body>
</html>

 

github: github.com/soulwine-it

자료출처 : 자바 웹을 다루는 기술

 

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

스프링 프레임워크는 웹 애플리케이션 개발에 필요한 여러 가지 기능을 미리 만들어서 제공합니다. MVC 기능도 그 중 하나입니다. 스프링에서 제공하는 기능 사용법을 익히고 나면 MVC기능을 일일이 만들 필요 없이 편리하게 MVC 기능을 사용할 수 있습니다.

  스프링에서 지원하는 MVC 기능의 특징은 다음과 같습니다.

  • 모델2 아키텍처를 지원합니다.
  • 스프링과 다른 모듈과의 연계가 쉽습니다.
  • 타일즈나 사이트메시같은 View 기술과의 연계가 쉽습니다.
  • 태그 라이브러리를 통해 message 출력, theme 적용 그리고 입력 폼을 보다 쉽게 구현할 수 있습니다.

스프링에서는 애플리케이션 개발 시 많이 사용되는 모델2 기반의 MVC 기능을 제공하므로 편리하게 애플리케이션을 개발할 수 있습니다. 그리고 타일즈나 사이트메시처럼 화면 관련 프레임워크와도 쉽게 연동할 수 있습니다.

구성요소 설명
DispatcherServlet 클라이언트의 요청을 전달받아 해당 요청에 대한 컨트롤러를 선택하여 클라이언트의 요청을 전달합니다. 또한 컨트롤러가 반환한 값을 View에 전달하여 알맞은 응답을 생성합니다.
HandlerMapping 클라이언트가 요청한 URL을 처리할 컨트롤러를 지정합니다.
Controller 클라이언트의 요청을 처리한 후 그 결과를 DispatcherServlet에 전달합니다.
ModelAndView 컨트롤러가 처리한 결과 및 뷰 선택에 필요한 정보를 저장합니다.
ViewResorlver 컨트롤러의 처리 결과를 전달할 뷰를 지정합니다.
View 컨트롤러의 처리 결과 화면을 생성합니다.

출처 : https://gmlwjd9405.github.io/2018/12/20/spring-mvc-framework.html

1. 브라우저가 DispatcherServlet에 URL로 접근하여 해당 정보를 요청합니다.

2. 핸들러 맵핑에서 해당 요청에 대해 매핑된 컨트롤러가 있는지 요청합니다.

3. 매핑된 컨트롤러에 대해 처리를 요청합니다.

4. 컨트롤러가 클라이언트의 요청을 처리한 결과와 View 이름을 ModelAndView에 저장해서 DispatcherServlet으로 반환합니다.

5. DispatcherServlet에서는 컨트롤러에서 보내온 View 이름을 ViewResolver로 보내 해당 View를 요청합니다.

6. ViewResorvler는 요청한 View를 보냅니다.

7. View의 처리 결과를 DispatcherServlet으로 보냅니다.

8. DispatcherServlet은 최종 결과를 브라우저로 전송합니다.

 

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

Spring Framework(스프링 프레임워크)

  • 자바 엔터프라이즈 개발을 편하게 해주는 경량급 오픈소스 애플리케이션 프레임워크이다.
  • POJO 기반의 엔터프라이즈 애플리케이션 개발을 쉽고 편하게 할 수 있도록 한다.
  • 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공한다.
  • 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자 정부 표준 프레임워크의 기반 기술

Spring의 특징

  • EJB보다 가볍고 배우기도 쉬우며 경량 컨테이너의 기능을 수행합니다.
  • 제어 역행(IoC, Inversion of Control) 기술을 이용해 애플리케이션 간의 느슨한 결합을 제어합니다.
  • [서블릿이나 빈 등을 개발자가 코드에서 생성하지 않고 프레임워크가 직접 수행하는 방법입니다.]
  • 의존성 주입(DI, Dependency Injection)기능을 지원합니다.
  • [ 클래스 객체를 개발자가 코드에 생성하지 않고 프레임워크가 생성하여 사용하는 방법]
  • 관점 지향(AOP, Aspect-Oriented Programming) 기능을 이용해 자원 관리를 합니다.
  • [핵심 기능 외 부수 기능들을 분리 구현함으로써 모듈성을 증가시키는 방법입니다.]
  • 영속성과 관련된 다양한 서비스를 지원합니다.
  • 수많은 라이브러리와의 연동 기능을 지원합니다.

접근 제한자( public > protected > default >private)

  • public - 접근의 제한이 없다
  • protected - 같은 패키지 or 다른패키지에서 상속받아 사용 가능
  • default - 같은 패키지 내에서만 접근 가능
  • private - 같은 클래스 내에서만 접근 가능

 

Stack과 Que

Stack

  • LIFO(Last In First Out)
  • push() 데이터 입력/ pop() 데이터 출력

Que

  • FIFO(First In First Out)
  • enQueue() 데이터 입력 / deQueue() 데이터 출력

그림참조 : https://article2.tistory.com/818

반응형

'2020 > 신입 개발자 면접 질문 모음' 카테고리의 다른 글

ERP? Framework?  (0) 2020.03.11
URI와 URL의 차이  (0) 2019.12.09
신입개발자 면접 질문 #2  (0) 2019.12.06
신입개발자 면접 질문 #1  (0) 2019.12.06
가비지 컬렉션이란?  (0) 2019.12.06
블로그 이미지

꽃꽂이하는개발자

,