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 수업 내용을 정리하고 확인하는 과정이었다.
이론을 다시 설명하기보다는
- 내가 어떤 구조를 선택했는지
- 왜 그렇게 구현했는지
- 수업 내용을 코드에서 어떻게 지켰는지
를 중심으로 정리했다.
다음 단계로 웹 프로젝트로 넘어가더라도 이 구조와 흐름은 그대로 가져갈 수 있을 것 같다.
'수업 복습' 카테고리의 다른 글
| FC 구조를 Spring MVC (DS)로 갈아끼우기 (0) | 2026.01.16 |
|---|---|
| FrontController에서 DispatcherServlet까지 (0) | 2026.01.16 |
| 객체지향 → IoC → Spring Container 흐름 (0) | 2026.01.14 |
| Spring DI (의존성 주입) (1) | 2026.01.14 |
| 다형성 복습 및 과제 (0) | 2026.01.13 |