FullStack Study/9주차

JAVA 풀스택 39일차 - JDBC (MVC 패턴)

레몬팡777 2026. 5. 21. 12:39

1. MVC 심화 구조

1-1 기존 방식

기능 + 구현코드 (한 클래스에 작성)

- 관리 어려움

- 수정 어려움

public class MemberDao {

    public List<Member> selectAll(Connection con){
        // SQL 실행 코드
    }
}

2. Interface  - impl 구조

MemberDao             ← 인터페이스 (기능 정의)
MemberDaoImpl     ← 실제 구현 클래스 (실제 구현)

MemberService         ← 인터페이스 (기능 정의)
MemberServiceImpl ← 실제 구현 클래스 (실제 구현) 

3. Interface

기능의 규칙을 미리 정의하는 것

public interface MemberDao{

public List<Member> selectAll(Connection con);

public Member selectOne(Connection con, int n);

public int insert(Connection con, Member m);

public int update(Connection con, Member m);

public int delete(Connection con, int n);
}

-  기능

4.  Impl 클래스

인터페이스에서 정의한 기능을 실제 구현하는 클래스

public class MemberDaoImpl implements MemberDao{
	public int insert(Connection con, Member m) {
	String sql = " INSERT INTO MEMBER VALUES(SEQ_MEMBER.NEXTVAL, ?,?,?,?,?,?,?) ";

	// SQL 실행 코드
	}
}

5. Interface - Impl 구조 사용 이유

5-1 역할 분리

인터페이스 (규칙 정의), Impl (실제 구현) 분리

5-2 유지보수 쉬움

DB 구조가 변경되어도 인터페이스는 그대로 두고 Impl만 수정  가능

5-3 코드 교체 쉬움

DB가 Oracle 에서 MySQL로 변경되어도 Impl만 바꿔도 사용 가능

6. SQL문 상수화

String selectAll = " SELECT * FROM MEMBER ";
String selectOne = " SELECT * FROM MEMBER WHERE M_NO = ? ";
String insert = " INSERT INTO MEMBER VALUES(SEQ_MEMBER.NEXTVAL, ?,?,?,?,?,?,?) ";
String update = " UPDATE MEMBER SET M_LOCATION = ?, M_JOB = ?, M_TEL = ? WHERE M_NO = ? ";
String delete = " DELETE MEMBER WHERE M_NO = ? ";

- SQL 수정 시 한 곳만 변경함으로 전체 수정 가능

- SQL 관리 편함

6-1 기존 방식

pstm = con.prepareStatement(" SELECT * FROM MEMBER ");

- SQL 직접 작성

6-2 상수화 방식

pstm = con.prepareStatement(selectAll);

- 변수처럼 재사용 가능

7. 기존 Controller

기존에는 기능별로 Controller을 따로 구현

MemberInsertController
MemberSelectController
MemberDeleteController

- 클래스 관리 어려움

-  중복 코드 증가

8. 통합 Controller

기능을 하나의 Controller로 통합

public Object doMethod(Object ... obj) {
    String req = (String) obj[0];

    if(req.equals("selectAll")) {
        List<Member> res = s.selectAll();
        return res;

    } else if(req.equals("selectOne")) {
        int no = (int) obj[1];
        Member res = s.selectOne(no);
        return res;

    } else if(req.equals("insert")) {
        Member m = (Member) obj[1];
        int res = s.insert(m);
        return res;
    }

    return null;
}

- Controller 클래스 하나로 여러 기능 처리 가능

9. 가변인자

매개 변수 개수를 자유롭게 받을 수 있는 문법

public Object doMethod(Object ... obj)

9-1 가변인자 사용하는 이유

통합 Controller에서는 기능마다 필요한 값 개수가 다르기 때문

기능 필요한 값
전체 조회 "selectAll"
선택 조회 "selectOne", 회원 번호
추가 "insert", Member 객체

- 매개변수를 자유롭게 받기 위해 가변인자 사용

예시

전체 조회

con.doMethod("selectAll");

선택 조회

con.doMethod("selectOne", inputNo());

추가

con.doMethod("insert", inputMember());

10. req 기능 구분

String req = (String)obj[0];

- 첫 번째 값에 기능 이름 저장

예시

"selectAll"
"insert"
"delete"