개발공부 일지
학원수업_44day [JSP,Servlet(11day) - Model2-MVC, Singleton] 본문
학원수업_44day [JSP,Servlet(11day) - Model2-MVC, Singleton]
짜몽- 2022. 10. 4. 15:37webstudy15-forward-redirect
*전주 복습*
HTTP -> stateless
사용자 정보유지,
Session , Cookie
get 방식 특징을 설명하시오
- attp 요청방식, request, response
정보조회용, url 노출된다.
전송량에 제한이 있다
post 방식 특징을 설명하시오
url 노출되지않는다
전송량에 제한이 없다.
정보전송용
HTTP : 하이퍼텍스트 프로토콜
- MVC 는 ?
앱 어플리케이션을 기반으로 보는 디자인패턴이다
web mvc : 웹어플리케이션 설계방식이다.
Model2 MVC :
비지니스 로직, Data access 업무를 정의하고, 데이터베이스 연동을 담당한다.
java component , Model :
- DAO, Service , VO
View
- client 에게 response (전달) 한다
클라이언트에게 보여주는 걸 담당 한다 ( 동적인 웹페이지를 응답해서 생성하여 응답한다)
주 기술은 jsp
Controller
- model 가 view를 제어한다.
클라이언트의 request 를 분석한다.
clent request 분석하여 model 과 연동, 주로 request 나 session 에 연동결과를 공유한다.
→ 적절한 view 선택을 한다. 여기서 제어 이동방식은 두 가지가 있다.
첫번째 : request 와 response 유지 하는 방법 - forward
두번째 request 와 response 를 유지 하지않고 새로 생성 , client 에게 어디로 이동하라고 제어 이동방식을 하는것 - redirect
☞ Controller 에서 view 로 제어를 연동할때 쓰는 기술 두 가지이다.
제어이동을 위한 기술로서, forward 은 기존 컨테이너 사이에서만 이동하는것
redirect 는 처리를 하고, 클라이언트에게 url를 줘서 어디로 이동하세요 해주는것 ?기존의 response request 를 유지하지않는다.
3 Tier 구성 서버

첫 번째 계층
Presentation Tier(Client) - 일반 사용자가 직접 액세스 할 수 있는 프레젠테이션 계층
콘텐츠를 HTML/JS/CSS 형식으로 브라우저에 전송하는 계층(React, ..)
모든 HTTPS 지원 클라이언트 또는 장치와 통신할 수 있으므로 프레젠테이션 계층은 다양한 형식(데스크탑 어플리케이션, 모바일 앱, 웹페이지, IoT 장치 등)을 유연하게 수행 할 수 있다.
두 번째 계층
Logic Tier(Application) - 비즈니스 로직이 실행되는 비즈니스 로직 계층
예) 어플리케이션 서버를 사용하고 어플리케이션에 대한 비즈니스 논리를 처리하는 계층(C#,Java,C++,Python,..)
세 번째 계층
Data Tier(Database) - 데이터 스토리지 계층
응용 프로그램 데이터에 대한 액세스를 제공하는 데이터베이스 관리 시스템(MySQL, Postgres,..)
* Tier : 컴포넌트들의 물리적인 분리
* Layer : 컴포넌트들의 논리적인 분리
이 아키텍처는 프론트엔드, 백엔드 그리고 각 계층에 특정 작업이 있으며 독립적으로 관리되는 데이터베이스같은 클라이언트-서버 어플리케이션을 실행하는데 사용된다.
3계층 상세 설명
프리젠테이션 계층
프리젠테이션 계층은 일반 사용자가 애플리케이션과 상호작용하는 애플리케이션의 사용자 인터페이스 및 통신 계층이다 주요 목적은 정보를 표시하고 사용자로부터 정보를 수집하는 것이다.이 최상위 레벨 계층은 예를 들어 웹 브라우저, 데스크탑 애플리케이션 또는 그래픽 사용자 인터페이스(GUI)에서 실행될 수 있다. 웹 프리젠테이션 계층은 일반적으로 HTML, CSS 및 JavaScript를 사용하여 개발된다. 데스크탑 애플리케이션은 플랫폼에 따라 다양한 언어로 작성될 수 있다.
애플리케이션 계층
논리 계층 또는 중간 계층라고도 하는 애플리케이션 계층은 애플리케이션의 핵심이다. 이 계층에서는 프리젠테이션 계층에서 수집된 정보가 처리된다. 때때로 이는 데이터 계층의 다른 정보에 대해 처리되며, 비즈니스 규칙의 특정 세트인 비즈니스 로직을 사용한다. 또한 애플리케이션 계층은 데이터 계층의 데이터를 추가, 삭제 또는 수정할 수도 있다.
애플리케이션 계층은 일반적으로 Python, Java, Perl, PHP 또는 Ruby를 사용하여 개발되며, API 호출을 사용하여 데이터 계층과 통신한다.
데이터 계층
종종 데이터베이스 계층, 데이터 액세스 계층 또는 백엔드라고도 불리는 데이터 계층은 애플리케이션이 처리하는 정보가 저장 및 관리되는 곳이다. 이는 관계형 데이터베이스 관리 시스템(예: PostgreSQL, MySQL, MariaDB, Oracle, DB2, Informix 또는 Microsoft SQL Server) 또는 비-SQL 데이터베이스 서버(예: Cassandra, CouchDB 또는 MongoDB)일 수 있다.
Model2 MVC 설계방식

- forward 와 rediect Test
Controller 에서 View 로 제어를 이동하는 방식 : forward 와 redirect 테스트
(설계와 먼저 순서 짜보기)
먼저 기초적인 설계도를 만들고 MVC 모델2 패턴에 따라 View, Controller , Model 을 나누어 정리한다.


Controller 에서 View 로 제어를 이동하는 방식, 제어를 선택하는 방식의 두 가지 방법 중
forward 방식으로 만들어보자.
- * id로 회원검색*
1. index.jsp 만들기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<h4>Model2 MVC 설계방식 - forward 와 rediect Test</h4> <br><br>
<%--
Controller 에서 View 로 제어를 이동하는 방식 : forward 와 redirect 테스트
--%>
<a href="findbyid-form.jsp">아이디로 회원 검색</a>
--%>
<a href="register-form.jsp">회원등록</a>
</div>
</body>
</html>
2. findbyid-form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>findbyid-form</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<a href="index.jsp">Home</a>
<br><br>
<form method="get" action="FindMemberByIdServlet">
<input type="text" name="memberId" placeholder="회원아이디" required="required">
<button type="submit">검색</button>
</form>
</div>
</body>
</html>

3.MerberDAO(model) - DB연결
public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection con) throws SQLException {
if(rs!=null)
rs.close();
if(pstmt!=null)
pstmt.close();
if(con!=null)
con.close();
public MemberVO findMemberById(String id) throws SQLException {
MemberVO memberVO=null;
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
con=getConnection();
String sql="select name,address from member where id=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, id);
rs=pstmt.executeQuery();
if(rs.next()) {
memberVO=new MemberVO(id,null,rs.getString(1),rs.getString(2));
}
}finally {
closeAll(rs, pstmt, con);
}
return memberVO;
3-1 DAO 는 DB 와 연결 시켜주는 것이기에 SQL문 작성 시 꼭 SQL 에 확인을 해준다
( 알맞는 테이블과 원하는 값이 얻어지는지)
4. findMemberByIdServlet(id) : MemberVO 연결
package org.kosta.webstudy15.model;
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
public MemberVO() {
super();
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
}
}
MemberVO - id,password,name,address
4-1 findMemberByIdServlet(id) 만들기
package org.kosta.webstudy15.controller;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kosta.webstudy15.model.MemberDAO;
import org.kosta.webstudy15.model.MemberVO;
@WebServlet("/FindMemberByIdServlet")
public class FindMemberByIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// client의 request 분석
String id=request.getParameter("memberId");
// Model 과 연동
//MemberDAO dao=new MemberDAO();
MemberDAO dao = MemberDAO.getInstance(); //싱글톤 디자인 패턴, 리팩토링하면서 추가
try {
MemberVO memberVO=dao.findMemberById(id);
String path=null;
if(memberVO==null) {
path="findbyid-fail.jsp";
}else {
request.setAttribute("memberVO", memberVO);
path="findbyid-ok.jsp";
}
request.getRequestDispatcher(path).forward(request, response); // forward로 처리한 이유는 다른 방식으로 하면 request가 유지되지 않기 때문에
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5-1 fail 또는 ok 일 경우 해당 화면에 나오도록 jsp를 만든다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>findbyid-fail</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<script type="text/javascript">
alert("아이디에 대한 회원이 존재하지 않습니다");
location.href="index.jsp";
</script>
</div>
</body>
</html>
fail 일 경우 alert 을 이용해 "아이디에 대한 회원이 존재하지 않습니다 를 띄워준다.
그리고 그 아래 location 을 이용하여 해당 페이지로 넘어 가는 링크를 작성해준다.
5-2 ok 일 경우
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="org.kosta.webstudy15.model.MemberVO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>findbyid-ok</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<% MemberVO vo=(MemberVO)request.getAttribute("dao"); %> <!--(MemberVO) 를 넣은 이유는, 다운캐스팅을 해주기 때문이다. 최상위클래스는 object에서
(object 캐스팅)MemberVO 클래스 아래로 내려오기때문에 맞지가 않아서 다운캐스팅해줘서 같은 클래스위치로 맞춘다. -->
<a href="index.jsp">Home</a><br><br>
<%=request.getParameter("memberId") %> 아이디에 대한 회원검색 결과 <br><br>
<table class="table table-bordered">
<tr>
<td>이름</td><td><%=vo.getName() %> </td>
</tr>
<tr>
<td>주소</td><td><%=vo.getAddress() %> </td>
</tr>
</table>
</div>
</body>
</html>

* 회원 등록 시스템*
post 방식으로 작성, redirect 방식

회원등록 시스템으로, 기존에 있는 아이디 일 경우 fail, 그렇지 않을 경우 가입이 가능하여 result 로 처리해준다.
1. register-form.jsp 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원등록폼</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<a href="index.jsp">Home</a><br><br>
<form action="RegisterMemberServlet" method="post"> <!-- 정보조회가아닌 전송이니까 post -->
<input type="text" name="id" placeholder="아이디" required="required"><br>
<input type="password" name="password" placeholder="패스워드" required="required"><br>
<input type="text" name="name" placeholder="이름" required="required"><br>
<input type="text" name="address" placeholder="주소" required="required"><br>
<button type="submit">회원등록</button>
</form>
</div>
</body>
</html>
1. Member DAO , register 메서드 작성
package org.kosta.webstudy15.model;
import java.sql.Connection;
public void closeAll(PreparedStatement pstmt,Connection con) throws SQLException {
if(pstmt!=null)
pstmt.close();
if(con!=null)
con.close();
public void registerMember(MemberVO vo) throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
try {
con=getConnection();
String sql="insert into member(id,password,name,address) values(?,?,?,?)";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, vo.getId());
pstmt.setString(2, vo.getPassword());
pstmt.setString(3, vo.getName());
pstmt.setString(4, vo.getAddress());
pstmt.executeUpdate();
}finally {
closeAll(pstmt, con);
}
}
1-1 SQL문으로 확인하여 insert 해준다
select * from member
select * from member where id='javaking';
-- 회원등록 sql test : MemberDAO registerMember에 적용할 sql
insert into member (id,password,name,address) values ('javaking','a','지영','서울')
2. RegisterMemberServlet 만들기
package org.kosta.webstudy15.controller;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kosta.webstudy15.model.MemberDAO;
/**
* Servlet implementation class RegisterMemberServlet
*/
@WebServlet("/RegisterMemberServlet")
public class RegisterMemberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("회원등록");
request.setCharacterEncoding("utf-8");
//MemberDAO dao = new MemberDAO();
MemberDAO dao=MemberDAO.getInstance(); //Singleton Design Pattern
String id=request.getParameter("id");
String password=request.getParameter("password");
String name=request.getParameter("name");
String address=request.getParameter("address");
try {
if (dao.findMemberById(id)==null) { //이문장을 쓰면 try,catch 나옴
dao.registerMember(id, password, name, address);
response.sendRedirect("register-result.jsp");
}else {
}
} catch (SQLException e) {
e.printStackTrace();
}
//또는 강사님은
/* try { //id가 중복되면
if(dao.findMemberById(id)!=null) {
response.sendRedirect("register-fail.jsp)";
} else { //id가 중복되지않으면
String password=request.getParameter("password");
String name=request.getParameter("name");
String address=request.getParameter("address");
}
*/
}
}
여기서 Servlet 을 작성할때 , register-form 차례대로 맞게 String 을 쓰기 위해 좌우로 놓고 작성해도 된다.

3. TestCaseRegisterMember
package org.kosta.webstudy15.test.step1;
import java.sql.SQLException;
import org.kosta.webstudy15.model.MemberDAO;
import org.kosta.webstudy15.model.MemberVO;
public class TestCaseRegisterMember {
public static void main(String[] args) {
//MemberDAO dao=new MemberDAO();// Singleton Pattern 적용되었으므로 error
MemberDAO dao=MemberDAO.getInstance();
MemberVO vo=new MemberVO("java2","a","rm","오리");
try {
if(dao.findMemberById(vo.getId())==null) { // id에 대한 회원이 존재하지 않을 때 등록한다
dao.registerMember(vo);
System.out.println("회원 등록이 완료되었습니다");
}else {
System.out.println("아이디에 대한 회원이 존재합니다. 다른 아이디로 등록하세요");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4. register.fail ( 기존에 중복되는 데이터가 있어 (아이디가 있어서) fail 일 경우
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>register-fail</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<script type="text/javascript">
alert("회원아이디가 중복되어 가입불가합니다");
location.href="register-form.jsp";
</script>
</div>
</body>
</html>
4-1 register - result ( 기존의 회원정보가 없어 가입이 될 경우)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>register-result</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<a href="index.jsp">Home</a><br><br>
회원가입을 축하합니다
</div>
</body>
</html>
MSA (MicroService Architecuture)
- Singleton Design Pattern ( 싱글톤 패턴)
: 시스템 상에서 단 하나의 객체를 생성하고 공유해서 사용하는 설계 패턴
→ 특정 클래스의 인스턴스를 하나만 생성해서 사용해 서버의 자원을 효율적으로 사용

적응단계
1. private 생성자 : 생성자에 private access modifier를 명시해서 다른 클래스에서 생성하는 것을 원천적 차단
2. private static 변수 : static 변수는 class loading 시 단 한번 초기화 되는 속성을 이용해
자신의 객체를 생성해 static 변수에 저장한다
3. public static 메서드로 공유 : static method는 별도의 객체 생성없이 클래스로 접근해
사용 가능한 속성을 이용해 한번 생성한 자신의 객체 주소값을
외부에 공유 (외부공유,객체의 참조값공유)
ex ) public class Company{
- 자신의 객체를 생성해 static 변수에 할당 , class loading 시 한번 실행
private static Company instance=new Company();
private Company(){} // 외부에서 객체 생성 불가하게 private 명시
public static Company getInstance(){ //외부에서 접근해 사용하도록 공유
return instance;
}
}
/*
* Singleton Design Pattern 적용해서
* 시스템 상에서 MemberDAO 객체를 단 한번 생성해서 사용하도록 한다
* 1. private 생성자
* 2. private static 변수로 객체 생성해서 초기화 ( instance 변수명 )
* 3. public static 메서드로 외부에 공유 ( getInstance () )
*/
public class MemberDAO {
private static MemberDAO instance=new MemberDAO();
private MemberDAO() {}
public static MemberDAO getInstance() {
return instance;
싱글톤 디자인패턴은 인스턴스변수가 가장 중요한 것인데,
먼저 기초적으로 돌아가서
static 변수와 instance 변수란 ?
클래스변수 ( static 변수 )
- 어디에서 선언이 되더라도 공유되어 질 수 있다.
- static 이 선언되는 순간에 하나의 메모리공간이 할당되어 , 그순간부터 공유가 가능하다.
- 클래스 내에 Static 키워드로 선언된 변수
- 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램이 종료될 때까지 유지
- 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
- 동일한 클래스의 모든 객체들에 의해서 공유됨
인스턴스변수 (Non-static 멤버)
- 클래스가 생성될때 메모리공간이 할당되고 생성자에 있는 값으로 초기화된다.
- 클래스 내에 선언된 변수
- 객체 생성 시마다 매번 새로운 변수가 생성됨
- 클래스 변수와 달리 공유되지 않음
static 변수와 instance 변수는 언제 초기화가 될까?
package org.kosta.webstudy15.test.step2;
// static 변수는 언제 초기화 될까?
// instance 변수는 언제 초기화 될까?
class Fish{
int i;
static int si;
}
public class TestStatic {
public static void main(String[] args) {
//Fish class의 static si 변수에 접근해서 출력
System.out.println(Fish.si);//Fish class loading 시점에 static member 초기화 , meta space memory
// System.out.println(Fish.i); // static 이 아니므로 error
Fish f=new Fish();// instance variable 은 객체 생성시 초기화 , heap memory
System.out.println(f.i);
}
}
- CompanyDAO
package org.kosta.webstudy15.test.step3;
/*
* Singleton Design Pattern 적용
*/
public class CompanyDAO {
// class loading 시 static 초기화 되는 속성을 이용해 자신의 객체를 단 한번 생성해 저장한다
private static CompanyDAO instance=new CompanyDAO();
private CompanyDAO() {// private 생성자로 외부에서 객체 생성 불가하게 한다
System.out.println("CompanyDAO 생성자 실행! 객체생성");
}
//한번 만든 자신의 객체를 외부에서 사용하도록 public static method로 공유한다
public static CompanyDAO getInstance() {
return instance;
}
// method
public void register() {
System.out.println("회사 정보를 등록하다");
}
public String findCompanyInfo() {
return "회사정보 조회결과";
}
}
* CompanyDAO 로 실행 시켜보자
package org.kosta.webstudy15.test.step3;
public class TestSingletonDesignPattern {
public static void main(String[] args) {
// private 생성자이므로 외부에서 생성불가 compile error
//CompanyDAO companyDAO=new CompanyDAO();
System.out.println(CompanyDAO.getInstance());
System.out.println(CompanyDAO.getInstance());
System.out.println(CompanyDAO.getInstance());
System.out.println(CompanyDAO.getInstance());
// 위 결과를 확인하면 객체 생성은 단 한번 , 하나의
// 객체가 반환된다
CompanyDAO.getInstance().register();
System.out.println(CompanyDAO.getInstance().findCompanyInfo());
}
}'학원수업 > Web(HMTL,CSS,JSP,Servlet)' 카테고리의 다른 글
| 학원수업_46day [JSP,Servlet(13day) - MVC Product] (0) | 2022.10.06 |
|---|---|
| 학원수업_45day [JSP,Servlet(12day) - EL , JSTL] (0) | 2022.10.05 |
| 학원수업_43day [HTML,CSS,JSP,Servlet(10day) - Model2-MVC / forward, redirect] (0) | 2022.09.30 |
| 학원수업_41day [HTML,CSS,JSP,Servlet(8day) - JSP] (0) | 2022.09.28 |
| 학원수업_40day [HTML,CSS,JSP,Servlet(7day) - Cookie / Session] (0) | 2022.09.27 |