관리 메뉴

me made it !

[JSP] 20230313 JSP 모델 1 방식으로 게시판 만들기 본문

TIL/JSP

[JSP] 20230313 JSP 모델 1 방식으로 게시판 만들기

yeoney 2023. 3. 13. 17:44
반응형

mvc 패턴  / 

package example1230;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class MemberDao{

	//멤버변수 전역
	private Connection conn;
	
	public MemberDao(){	//MemberDao 생성할 때 Dbconn 객체도 생성시킴 => conn객체 생성
		Dbconn dbconn = new Dbconn();
		this.conn = dbconn.getConnection();
	}
	
	
	 public int memberInsert(String memberId, String memberPwd, String memberName , String memberPhone , String memberEmail , String memberGender , String memberAddr , String memberBirth){
		 int value = 0;
		 PreparedStatement pstmt= null;	 
		 String sql ="INSERT INTO member1230(midx,memberId,memberPwd,memberName,memberPhone,memberEmail,memberGender,memberAddr,memberBirth,ip)"+
			       "VALUES(midx_seq.nextval,?,?,?,?,?,?,?,?,null)";
	// 구문 쿼리클래스
			try{
				 pstmt = conn.prepareStatement(sql);
				 pstmt.setString(1,memberId);	
				 pstmt.setString(2,memberPwd);
				 pstmt.setString(3,memberName);
				 pstmt.setString(4,memberPhone);
				 pstmt.setString(5,memberEmail);
				 pstmt.setString(6,memberGender);
				 pstmt.setString(7,memberAddr);
				 pstmt.setString(8,memberBirth);
				 pstmt.executeUpdate();
			}catch(Exception e){
					e.printStackTrace();
			}finally{
				try{
					pstmt.close();
					conn.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			return value;
	 }
	
	 @SuppressWarnings("finally")
	public ArrayList<MemberVo> memberSelectAll() {
		 ArrayList<MemberVo> alist = new ArrayList<MemberVo>();
		 String sql = "select midx, memberid, membername, delyn, writeday from member1230 order by midx desc";
		 
		 PreparedStatement pstmt = null;
		 ResultSet rs = null;
		 try {
			 pstmt = conn.prepareStatement(sql);
			 rs = pstmt.executeQuery();
		
			 
			 while(rs.next()) {	//커서의 다음 값이 존재하면 참
			 MemberVo mv = new MemberVo();		//MemberVo 객체 생성해서
			 mv.setMidx(rs.getInt("midx"));	//rs 값들을 옮겨담는다
			 mv.setMemberid(rs.getString("memberid"));
			 mv.setMembername(rs.getString("membername"));
			 mv.setDelyn(rs.getString("delyn"));
			 mv.setWriteday(rs.getString("writeday"));
			 alist.add(mv);		//alist  클래스 안에 MemberVo 객체를 하나씩 추가한다
			 
			 }
		 
		 } catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}		
		
		 
		 return alist;
	 }
	 
}
}

 

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@page import = "example1230.MemberDao" %>
<%
 request.setCharacterEncoding("UTF-8");
 
 
 String memberId = request.getParameter("memberId");
 String memberPwd = request.getParameter("memberPwd");  
 String memberName = request.getParameter("memberName");  
 String memberPhone = request.getParameter("memberPhone");
 String memberEmail = request.getParameter("memberEmail");  
 String memberGender = request.getParameter("memberGender");  
 String memberAddr = request.getParameter("memberAddr");  
 String memberBirth = request.getParameter("memberBirth");

 MemberDao md= new MemberDao();
 md.memberInsert(memberId,memberPwd,memberName,memberPhone,memberEmail,memberGender,memberAddr,memberBirth);
 
 String path = request.getContextPath()+"./memberList.jsp";
 response.sendRedirect(path);
 
 
 %>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%> 
 <%@page import = "example1230.*" %>
 <%@page import = "java.util.*" %>
 <%
 MemberDao md = new MemberDao();
 ArrayList <MemberVo> alist = md.memberSelectAll();
 
 
 %>
      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
회원목록
<table border=1>
<tr>
<td>회원번호</td>
<td>회원아이디</td>
<td>회원이름</td>
<td>탈퇴여부</td>
<td>가입일</td>
</tr>

<% for (MemberVo mv : alist) {%>
<tr>
<td><%=mv.getMidx() %></td>
<td><%=mv.getMemberid() %></td>
<td><%=mv.getMembername() %></td>
<td><%=mv.getDelyn() %></td>
<td><%=mv.getWriteday() %></td>
</tr>

<%} %>
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script type="text/javascript">
$(document).ready(function(){
		//자동실행영역
});
function check(){
	//alert("각 값이 있는지 체크하는 구문을 만들어보세요");	
	
	if ($("#memberId").val() == ""){
		alert("아이디를 입력하세요");
		$("#memberId").focus();
		return;
	}else if ($("#memberPwd").val() == ""){
		alert("비밀번호를 입력하세요");
		$("#memberPwd").focus();
		return;
	}else if ($("#memberPwd2").val() == ""){
		alert("비밀번호 확인을 입력하세요");
		$("#memberPwd2").focus();
		return;
	}else if ($("#memberPwd").val() != $("#memberPwd2").val()){
		alert("비밀번호가 일치하지 않습니다");
		$("#memberPwd2").val("");
		$("#memberPwd2").focus();
		return;
	}else if ($("#memberName").val() == ""){
		alert("이름을 입력하세요");
		$("#memberName").focus();
		return;
	}else if ($("#memberPhone").val() == ""){
		alert("전화번호를 입력하세요");
		$("#memberPhone").focus();
		return;
	}else if ($("#memberEmail").val() == ""){
		alert("이메일을 입력하세요");
		$("#memberEmail").focus();
		return;
	}else if ($("#memberBirth").val() == ""){
		alert("생년월일을 입력하세요");
		$("#memberBirth").focus();
		return;
	}else if ($.isNumeric($("#memberBirth").val())  ==false){
		alert("숫자만입력하세요");
		$("#memberBirth").val("");
		$("#memberBirth").focus();
		return;
	}
//	else if ($("#memberIdCheck").val() != "Y"){
//		alert("아이디 중복체크를 하세요");
//		$("#memberId").focus();
//		return;
//	}	
	
	var fm = document.frm;
	//이 경로로 데이터를 감추어서 전송한다
	fm.action ="memberJoinAction.jsp";
	fm.method = "post";
	fm.submit();
	
	return;
}	

function idCheck(){
//	alert("아이디 체크창입니다.");	
	let memberId = $("#memberId").val();
	
	$.ajax({
		url: "json3.jsp",		
		method: "POST",
		data: {"memberId": memberId },
		dataType: "json",
		success : function(data){	
			if (data.idYn =="Y"){
				alert("사용가능한 아이디입니다.");
				$("#memberIdCheck").val("Y");
			}else{
				alert("사용불가한 아이디 입니다");
			}	
		},
		error : function(request,status,error){
			alert("다시 시도하시기 바랍니다.");		
		}		
	});	
	
	return;
}
</script>
</head>
<body>
회원가입 페이지
<form name="frm" id="frm">
<table style="border:1px solid #CCC;width:500px">
<tr>
<td>아이디</td>
<td>
<input type="text" name="memberId" id="memberId">
<input type="button"  id="memberIdCheck"  value="아이디 중복체크" onclick="idCheck();">
</td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="memberPwd" id="memberPwd"></td>
</tr>
<tr>
<td>비밀번호 확인</td>
<td><input type="password" name="memberPwd2" id="memberPwd2"></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" name="memberName" id="memberName"></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name="memberPhone" id="memberPhone"></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="text" name="memberEmail" id="memberEmail"></td>
</tr>
<tr>
<td>성별</td>
<td>
<input type="radio" name="memberGender" id="memberMale"  value="남성" checked>남성
<input type="radio" name="memberGender" id="memberFeMale" value="여성">여성
</td>
</tr>
<tr>
<td>주소</td>
<td>
<select name="memberAddr" id="memberAddr">
<option value="서울">서울</option>
<option value="대전">대전</option>
<option value="전주"   selected>전주</option>
</select>
</td>
</tr>
<tr>
<td>생년월일</td>
<td>
<input type="text" name="memberBirth"  id="memberBirth">
(ex 19990101)
</td>
</tr>
<tr>
<td></td>
<td><input type="button" name="btn"  id="btn" value="확인" onclick="check();"></td>
</tr>
</table>
</form>
</body>
</html>
package example1230;

import java.sql.Connection;
import java.sql.DriverManager;

public class Dbconn {
	
	private String url= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	private String user="system";
	private String password="1234";
	
	public Connection getConnection() {
	
		Connection conn= null ;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			conn = DriverManager.getConnection(url, user, password);		//연결객체 생성
		} catch (Exception e) {
			e.printStackTrace();
		}
	return conn;
	}
}

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@page import ="java.sql.*" %>
<%
//공통으로 사용하는 파일입니다
String url= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user="system";
String password="1234";
Class.forName("oracle.jdbc.driver.OracleDriver");	//동적로딩 - 메모리에 올린다
Connection conn = DriverManager.getConnection(url, user, password);	//DB와 접속시킨다.
out.println("연결객체주소는?"+conn);
%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@page import ="java.sql.*" %>
 <%!
 
 public int memberInsert(Connection conn, String memberId, String memberPwd, String memberName , String memberPhone , String memberEmail , String memberGender , String memberAddr , String memberBirth){
	 int value = 0;
	 PreparedStatement pstmt= null;	 
	 String sql ="INSERT INTO member1230(midx,memberId,memberPwd,memberName,memberPhone,memberEmail,memberGender,memberAddr,memberBirth,ip)"+
		       "VALUES(midx_seq.nextval,?,?,?,?,?,?,?,?,null)";
// 구문 쿼리클래스
		try{
			 pstmt = conn.prepareStatement(sql);
			 pstmt.setString(1,memberId);	
			 pstmt.setString(2,memberPwd);
			 pstmt.setString(3,memberName);
			 pstmt.setString(4,memberPhone);
			 pstmt.setString(5,memberEmail);
			 pstmt.setString(6,memberGender);
			 pstmt.setString(7,memberAddr);
			 pstmt.setString(8,memberBirth);
			 pstmt.executeUpdate();
		}catch(Exception e){
				e.printStackTrace();
		}finally{
			try{
				pstmt.close();
				conn.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return value;
 }
%>

 

package example1230;
							//Value Object  값을 담는 객체 (DTO)
public class MemberVo {

	private int midx;
	private String memberid;
	private String memberpwd;
	private String membername;
	private String memberphone;
	private String memberemail;
	private String membergender;
	private String memberaddr;
	private String memberbirth;
	private String delyn;
	private String writeday;
	private String ip;
	
	public int getMidx() {
		return midx;
	}
	public void setMidx(int midx) {
		this.midx = midx;
	}
	public String getMemberid() {
		return memberid;
	}
	public void setMemberid(String memberid) {
		this.memberid = memberid;
	}
	public String getMemberpwd() {
		return memberpwd;
	}
	public void setMemberpwd(String memberpwd) {
		this.memberpwd = memberpwd;
	}
	public String getMembername() {
		return membername;
	}
	public void setMembername(String membername) {
		this.membername = membername;
	}
	public String getMemberphone() {
		return memberphone;
	}
	public void setMemberphone(String memberphone) {
		this.memberphone = memberphone;
	}
	public String getMemberemail() {
		return memberemail;
	}
	public void setMemberemail(String memberemail) {
		this.memberemail = memberemail;
	}
	public String getMembergender() {
		return membergender;
	}
	public void setMembergender(String membergender) {
		this.membergender = membergender;
	}
	public String getMemberaddr() {
		return memberaddr;
	}
	public void setMemberaddr(String memberaddr) {
		this.memberaddr = memberaddr;
	}
	public String getMemberbirth() {
		return memberbirth;
	}
	public void setMemberbirth(String memberbirth) {
		this.memberbirth = memberbirth;
	}
	public String getDelyn() {
		return delyn;
	}
	public void setDelyn(String delyn) {
		this.delyn = delyn;
	}
	public String getWriteday() {
		return writeday;
	}
	public void setWriteday(String writeday) {
		this.writeday = writeday;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	
}

 

 


▶DAO(Data Access Object) : 데이터베이스 접근 객체


하나의 회원정보를 불러오거나 입력할 때 사용

 

 

Connection = 연결

PreparedStatement = 설정 및 실행

ResultSet = 결과값

   
String sql 실제로 DB에서 입력할 쿼리문을 'sql' 변수에 미리 담아둡니다
conn.preparedStatement(sql) 미리 설정한 'sql'을 셋팅하는 코드 
pstmt.setString(1,userID) 쿼리문의 '1'번째 물음표에 'userID'를 대입시키는 것
rs = pstmt.executeQuery() 셋팅이 끝난 쿼리문을 실행시키고 나온 결과값을 'rs'에 저장
rs.next() 결과 값이 존재한다면 해당 결과값을 얻을 수 있다

 

 


package example1230.controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
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 example1230.domain.MemberVo;
import example1230.service.MemberDao;

@WebServlet("/MemberController")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		
		String uri = request.getRequestURI();
		System.out.println("전체 주소는? "+uri);
		String projectName = request.getContextPath();		
		int projectLength = projectName.length();		
		String str = uri.substring(projectLength);	//실제 가상경로이름 추출
		System.out.println("가상경로는? "+str);
		
		if(str.equals("/member/memberList.do")) {	//추출한 가상경로가 이 문자열과 같나요?
			System.out.println("가상경로로 들어옴");

			MemberDao md = new MemberDao();
			 ArrayList <MemberVo> alist = md.memberSelectAll();
			 
			request.setAttribute("alist", alist);	//내부이동은 자원을 공유할 수 있다
			
			// 내부 이동
			RequestDispatcher rd = request.getRequestDispatcher("/member/memberList.jsp");
			rd.forward(request, response);
			
			
		}else if(str.equals("/member/memberJoin.do")) {
			System.out.println("memberJoin.do");
			RequestDispatcher rd = request.getRequestDispatcher("/member/memberJoin.jsp");
			rd.forward(request, response);
			
		}else if(str.equals("/member/memberJoinAction.do")) { 
			 String memberId = request.getParameter("memberId");
			 String memberPwd = request.getParameter("memberPwd");  
			 String memberName = request.getParameter("memberName");  
			 String memberPhone = request.getParameter("memberPhone");
			 String memberEmail = request.getParameter("memberEmail");  
			 String memberGender = request.getParameter("memberGender");  
			 String memberAddr = request.getParameter("memberAddr");  
			 String memberBirth = request.getParameter("memberBirth");

			 MemberDao md= new MemberDao();
			 md.memberInsert(memberId,memberPwd,memberName,memberPhone,memberEmail,memberGender,memberAddr,memberBirth);
			 
			 String path = request.getContextPath()+"/member/memberList.do";
			 response.sendRedirect(path);
			 
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		doGet(request, response);
	}

}

어노테이션 @ webServlet()  을 이용해서 클래스를 새로 만듦

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>example1230.controller.MemberController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

</web-app>

▶가상경로 만들기


▶배포 서술자(web.xml)

배포 서술자는 웹 애플리케이션의 환경설정 정보를 담은 파일입니다. WAS가 처음 구동될 때 이 파일을 읽어 설정 내용을 톰캣에 적용하게 됩니다. 서블릿 설정, 필터 설정, 웰컴 파일 목록, 오류 페이지 처리와 같은 설정을 할 수 있습니다.

 

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>

<a href="<%=request.getContextPath()%>/member/memberJoin.do">회원가입하기</a>

</body>
</html>
package example1230.domain;
							//Value Object  값을 담는 객체 (DTO)
public class MemberVo {

	private int midx;
	private String memberid;
	private String memberpwd;
	private String membername;
	private String memberphone;
	private String memberemail;
	private String membergender;
	private String memberaddr;
	private String memberbirth;
	private String delyn;
	private String writeday;
	private String ip;
	
	public int getMidx() {
		return midx;
	}
	public void setMidx(int midx) {
		this.midx = midx;
	}
	public String getMemberid() {
		return memberid;
	}
	public void setMemberid(String memberid) {
		this.memberid = memberid;
	}
	public String getMemberpwd() {
		return memberpwd;
	}
	public void setMemberpwd(String memberpwd) {
		this.memberpwd = memberpwd;
	}
	public String getMembername() {
		return membername;
	}
	public void setMembername(String membername) {
		this.membername = membername;
	}
	public String getMemberphone() {
		return memberphone;
	}
	public void setMemberphone(String memberphone) {
		this.memberphone = memberphone;
	}
	public String getMemberemail() {
		return memberemail;
	}
	public void setMemberemail(String memberemail) {
		this.memberemail = memberemail;
	}
	public String getMembergender() {
		return membergender;
	}
	public void setMembergender(String membergender) {
		this.membergender = membergender;
	}
	public String getMemberaddr() {
		return memberaddr;
	}
	public void setMemberaddr(String memberaddr) {
		this.memberaddr = memberaddr;
	}
	public String getMemberbirth() {
		return memberbirth;
	}
	public void setMemberbirth(String memberbirth) {
		this.memberbirth = memberbirth;
	}
	public String getDelyn() {
		return delyn;
	}
	public void setDelyn(String delyn) {
		this.delyn = delyn;
	}
	public String getWriteday() {
		return writeday;
	}
	public void setWriteday(String writeday) {
		this.writeday = writeday;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	
}
package example1230.service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import example1230.dbconn.Dbconn;
import example1230.domain.MemberVo;

public class MemberDao{

	//멤버변수 전역
	private Connection conn;
	
	public MemberDao(){	//MemberDao 생성할 때 Dbconn 객체도 생성시킴 => conn객체 생성
		Dbconn dbconn = new Dbconn();
		this.conn = dbconn.getConnection();
	}
	
	
	 public int memberInsert(String memberId, String memberPwd, String memberName , String memberPhone , String memberEmail , String memberGender , String memberAddr , String memberBirth){
		 int value = 0;
		 PreparedStatement pstmt= null;	 
		 String sql ="INSERT INTO member1230(midx,memberId,memberPwd,memberName,memberPhone,memberEmail,memberGender,memberAddr,memberBirth,ip)"+
			       "VALUES(midx_seq.nextval,?,?,?,?,?,?,?,?,null)";
	// 구문 쿼리클래스
			try{
				 pstmt = conn.prepareStatement(sql);
				 pstmt.setString(1,memberId);	
				 pstmt.setString(2,memberPwd);
				 pstmt.setString(3,memberName);
				 pstmt.setString(4,memberPhone);
				 pstmt.setString(5,memberEmail);
				 pstmt.setString(6,memberGender);
				 pstmt.setString(7,memberAddr);
				 pstmt.setString(8,memberBirth);
				 pstmt.executeUpdate();
			}catch(Exception e){
					e.printStackTrace();
			}finally{
				try{
					pstmt.close();
					conn.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			return value;
	 }
	
	 @SuppressWarnings("finally")
	public ArrayList<MemberVo> memberSelectAll() {
		 ArrayList<MemberVo> alist = new ArrayList<MemberVo>();
		 String sql = "select midx, memberid, membername, delyn, writeday from member1230 order by midx desc";
		 
		 PreparedStatement pstmt = null;
		 ResultSet rs = null;
		 try {
			 pstmt = conn.prepareStatement(sql);
			 rs = pstmt.executeQuery();
		
			 
			 while(rs.next()) {	//커서의 다음 값이 존재하면 참
			 MemberVo mv = new MemberVo();		//MemberVo 객체 생성해서
			 mv.setMidx(rs.getInt("midx"));	//rs 값들을 옮겨담는다
			 mv.setMemberid(rs.getString("memberid"));
			 mv.setMembername(rs.getString("membername"));
			 mv.setDelyn(rs.getString("delyn"));
			 mv.setWriteday(rs.getString("writeday"));
			 alist.add(mv);		//alist  클래스 안에 MemberVo 객체를 하나씩 추가한다
			 
			 }
		 
		 } catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}		
		
		 
		 return alist;
	 }
	 
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%> 
 <%@page import = "example1230.domain.*" %>
 <%@page import = "java.util.*" %>
 <%
ArrayList <MemberVo> alist = (ArrayList<MemberVo>)request.getAttribute("alist");

 %>
      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
회원목록
<table border=1>
<tr>
<td>회원번호</td>
<td>회원아이디</td>
<td>회원이름</td>
<td>탈퇴여부</td>
<td>가입일</td>
</tr>

<% for (MemberVo mv : alist) {%>
<tr>
<td><%=mv.getMidx() %></td>
<td><%=mv.getMemberid() %></td>
<td><%=mv.getMembername() %></td>
<td><%=mv.getDelyn() %></td>
<td><%=mv.getWriteday() %></td>
</tr>

<%} %>
</table>
</body>
</html>

 


https://developer.mozilla.org/ko/docs/Glossary/MVC

 

MVC - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고

developer.mozilla.org

https://cocoon1787.tistory.com/733

 

[개발상식] MVC 패턴이란? (Model-View-Controller)

🚀 이번 포스팅은 개발자 면접에서 자주 나오는 질문 중의 하나인 "MVC패턴"에 대한 내용입니다. MVC패턴의 의미와 사용해야 하는 이유, 사용 예시 등등에 대해 알아보겠습니다. 💡 MVC 패턴이란?

cocoon1787.tistory.com

 

반응형