수업 복습

콘솔 회원·게시판 프로그램

_김영인 2026. 1. 15. 11:11

1. 구현 배경

이번 콘솔 프로젝트는 게시판 (Board)과 회원 (Member) 기능을 Spring DI 구조로 구현하는 것이 목표였다.

 

기능 자체는 단순한 CRUD지만 수업에서 계속 강조된 포인트는 분명했다.

  • 객체를 직접 생성하지 말 것
  • 역할과 책임을 분리할 것
  • 구조를 먼저 잡고 기능을 얹을 것

그래서 이번 구현에서는 수업에서 배운 구조를 실제 코드로 옮기는 데 집중했다.


 

2. 전체 구조 개요

 

프로젝트는 게시판과 회원 기능을 완전히 동일한 구조로 구현했다.

Client (입력·흐름 제어)
   ↓
Service (비즈니스 단위 처리)
   ↓
DAO (DB 접근)

 

Board와 Member는

  • 패키지 구조
  • 클래스 역할
  • 호출 흐름

이 전부 동일하다.


도메인만 다르고 설계는 하나로 통일했다.

 

이 구조를 유지한 이유 구조를 이해했는지 가장 잘 보여주는 방법이기 때문이다.


 

3. 객체 생성과 DI 적용 방식

 

Service와 DAO 객체는 모두 Spring Container가 생성한다.

Client에서는 직접 객체를 만들지 않고 컨테이너에서 Bean을 받아 사용한다.

MemberService memberService =
    (MemberService) factory.getBean("ms");

 

Service 내부에서도 DAO를 직접 생성하지 않는다.

@Autowired
private MemberDAO memberDAO;

 

이렇게 구현함으로써

  • 객체 생성 책임은 컨테이너로 이동하고
  • 각 계층은 자신의 역할에만 집중하도록 만들었다.

 

4. DTO는 왜 직접 생성했는가

 

Service와 DAO에서는 new를 쓰지 않지만 DTO에서는 직접 객체를 생성한다.

MemberDTO dto = new MemberDTO();

 

DTO는 데이터를 담기 위한 객체이고 요청마다 값이 달라지며 재사용 대상이 아니다.

 

수업에서 정리된 기준대로

  • 로직 객체 → Spring 관리
  • 데이터 객체 → 직접 생성

을 명확히 구분해서 사용했다.


 

5. Board 코드를 기준으로 Member 구현하기

 

회원 기능은 게시판 코드를 그대로 참고해서 구현했다.

  • Client 흐름 동일
  • Service / DAO 구조 동일
  • 메서드 시그니처 패턴 동일

이 방식으로 구현하면서 기능보다 구조를 먼저 생각하게 되었고 코드 전체의 일관성도 유지할 수 있었다.


 

6. 콘솔 환경에서 로그인 상태 관리

 

웹이 아닌 콘솔 환경이기 때문에 세션 대신 로그인 상태를 객체 하나로 관리했다.

MemberDTO loginUser = null;
 

이 변수 하나로

  • 로그인 여부 판단
  • 수정 / 탈퇴 가능 여부
  • 로그아웃 처리

를 전부 제어했다.

 

로그인 시에는 객체를 할당하고

 
loginUser = data;

 

로그아웃 시에는 참조를 끊는다.

 
loginUser = null;

 

복잡한 구조 없이도 로그인 상태 흐름을 충분히 표현할 수 있었다.


 

7. 회원 기능 구현 시 고려한 흐름

 

회원 기능에서 신경 쓴 부분은 “기능 추가”보다 이용 흐름의 자연스러움이었다.

 

로그인

  • 이미 로그인된 상태에서는 다시 로그인 불가
  • 로그인 성공 시 상태 저장

 

회원정보 수정 / 탈퇴

  • 로그인 상태에서만 가능
  • 아이디를 따로 입력받지 않음
  • 현재 로그인된 사용자 기준으로 처리
dto.setMid(loginUser.getMid());

 

이 방식은

  • 콘솔 입력 흐름이 단순해지고
  • 처리 대상이 명확해지며
  • 게시판 수정/삭제 흐름과도 잘 맞는다.

8. 로그아웃 기능 추가

로그아웃은 별도의 로직이 필요하지 않았다.

loginUser = null;
 

로그인 상태를 나타내는 객체 참조만 제거하면 그 자체로 로그아웃 상태가 된다.

이 방식은 단순하지만 콘솔 프로그램에서는 충분히 명확한 표현이었다.


9. 입력 예외 처리 

메뉴 선택 시 숫자가 아닌 값을 입력하면 프로그램이 바로 종료되는 문제가 있었다.

그래서 nextInt() 대신 문자열 입력 후 직접 파싱하는 방식을 사용했다.

String input = sc.next();
try {
    command = Integer.parseInt(input);
} catch (NumberFormatException e) {
    System.out.println("숫자를 입력해주세요.");
    continue;
}
 

이 부분은 실습 중 실제로 에러를 겪고 나서 반영한 코드다.


 

10. 이번 구현의 핵심 정리

 

이번 프로젝트에서 가장 중요하게 가져간 기준은 다음과 같다.

  • 구조는 Board / Member 모두 동일하게 유지
  • Service / DAO는 Spring이 관리
  • DTO는 직접 생성
  • Client는 입력과 흐름만 담당
  • 로그인 상태는 객체 하나로 관리
  • 기능보다 흐름과 책임 분리에 집중

기능은 단순하지만 수업에서 배운 내용을 코드로 옮기는 연습으로는 충분한 과제였다.


 

 

이번 콘솔 프로젝트는 Spring DI 수업 내용을 정리하고 확인하는 과정이었다.

 

이론을 다시 설명하기보다는

  • 내가 어떤 구조를 선택했는지
  • 왜 그렇게 구현했는지
  • 수업 내용을 코드에서 어떻게 지켰는지

를 중심으로 정리했다.

 

다음 단계로 웹 프로젝트로 넘어가더라도 이 구조와 흐름은 그대로 가져갈 수 있을 것 같다.