Java Socket + Swing 기반의 1:1 온라인 배틀쉽 네트워크 게임
| 팀원 1 | 팀원 2 |
|---|---|
| 사진1 | 사진2 |
| 서버 개발 | 클라이언트 개발 |
| [GitHub](깃허브 링크) | [GitHub](깃허브 링크) |
역할 분담
- 팀원 1 (재원): 서버 전체(소켓, 도메인, 서비스, 컨트롤러, 어드민 UI), 통신 프로토콜/메시지 구조 설계, 게임 로직 및 턴/READY/시작 조건 설계, 공통 Message/Mode 설계
- 팀원 2: 클라이언트 전체(Swing UI, MVC, 클라 네트워크), Login/Lobby/Room/Game 화면 구현, 클라이언트 Listener 및 컨트롤러 구현
Java Socket을 이용한 다중 클라이언트 서버 기반의 배틀쉽 네트워크 게임입니다. 로비에서 방을 생성하거나 입장하여 다른 플레이어와 1:1 턴 기반 배틀쉽 게임을 즐길 수 있습니다.
주요 특징
- 단일 서버 - 다중 클라이언트 구조
- Object Stream 기반 직렬화 메시지 통신
- 로비 → 방 → 게임으로 이어지는 상태 전환
- 멀티스레드 기반 서버 (클라이언트별 스레드, 상태 관리)
- Swing UI 기반 클라이언트 (MVC 구조)
- 방 단위 채팅 기능
- 서버 Admin UI (모니터링/디버깅용)
- 전체 기간:
YYYY.MM.DD - YYYY.MM.DD - 개발 기간:
YYYY.MM.DD - YYYY.MM.DD
For building and running the application you need:
- JDK 17 이상
- Java 개발 환경 (IntelliJ IDEA)
- 로컬 네트워크 환경 (서버와 클라이언트 간 통신)
- 언어: Java
- UI 프레임워크: Swing
- 네트워크: Java Socket (ServerSocket, Socket)
- 통신 방식: ObjectInputStream / ObjectOutputStream
- 버전 및 이슈 관리: Github
- 협업 툴: Discord, Notion
| 로그인 화면 | 로비 화면 |
| 방 화면 | 게임 화면 |
src/com/hsu/byteship/server/controller/core/Server.java의main()메서드를 실행합니다.- 서버가 시작되면 지정된 포트(기본값:
server.txt참조)에서 클라이언트 접속을 대기합니다. - 서버 Admin UI가 자동으로 열려 현재 접속 클라이언트, 방 목록, 로그를 모니터링할 수 있습니다.
- 프로젝트 루트의
server.txt파일에 서버 IP 주소와 포트 번호가 올바르게 설정되어 있는지 확인합니다.127.0.0.1 54321 src/com/hsu/byteship/client/view/login/LoginView.java또는 클라이언트 진입점을 실행합니다.- 로그인 화면에서 닉네임을 입력하고 로비에 입장합니다.
- 로비에서 방을 생성하거나 기존 방에 입장할 수 있습니다.
Byteship/
├─ common/ # 서버·클라 공통으로 사용하는 공유 모델/메시지
│ ├─ message/
│ │ ├─ Message.java # 직렬화용 공통 메시지 DTO
│ │ └─ Mode.java # 통신 상태/기능을 나타내는 enum
│ └─ model/
│ └─ Coordinate.java # 배틀쉽 좌표(x,y) 표현용 Value Object
│
├─ server/ # 서버 전체
│ ├─ controller/ # 컨트롤러 계층
│ │ ├─ core/ # 서버 코어 (Server, ClientHandler, MessageDispatcher)
│ │ ├─ lobby/ # 로비 컨트롤러
│ │ ├─ room/ # 방 컨트롤러
│ │ ├─ game/ # 게임 컨트롤러
│ │ └─ chat/ # 채팅 컨트롤러
│ ├─ service/ # 비즈니스 로직 계층
│ ├─ model/ # 서버 도메인 모델
│ ├─ view/ # 서버 어드민용 Swing UI
│ └─ util/ # 서버 유틸리티
│
└─ client/ # 클라이언트 전체
├─ controller/ # 클라이언트 컨트롤러
├─ view/ # Swing UI 화면
├─ model/ # 클라이언트 모델
├─ config/ # 설정 파일 로더
└─ util/ # 클라이언트 유틸리티
- 방에는 최대 2명의 플레이어가 입장할 수 있습니다.
- 첫 번째 입장자는 방장(Host), 두 번째 입장자는 참가자(Player) 역할을 가집니다.
- 참가자는 방 화면에서 READY 버튼을 눌러 준비 상태가 될 수 있습니다.
- 두 플레이어 모두 READY 상태일 때만 방장이 게임을 시작할 수 있습니다.
- 게임은 턴 기반으로 진행되며, 각 턴마다 하나의 좌표에 공격을 수행합니다.
- 공격 결과는 HIT, MISS, DESTROYED 등으로 판정됩니다.
- 한쪽의 모든 배가 격침되면 게임이 종료되고 승패가 결정됩니다.
- 게임 종료 후 플레이어는 다시 로비로 돌아갑니다.
- main: 프로덕션 배포 가능한 안정적인 코드
- feature/000: 새로운 기능 개발
- fix/000: 버그 수정
- chore/000: 빌드/설정 관련 작업
- refactor/000: 코드 리팩토링
- docs/000: 문서 작업
{타입}/{간단한-설명}
예시:
feature/room-creationfix/login-errorchore/project-settingsrefactor/message-handlerdocs/readme-update
main에서 브랜치 생성 (feature/xxx)- 작업 후 커밋
- GitHub에 푸시
- Pull Request 생성
- 리뷰 후
main에 머지 - 브랜치 삭제
클래스/인터페이스
- 파스칼 케이스 (PascalCase)
- 명사 사용
- 예:
Server,ClientHandler,MessageDispatcher
메서드
- 카멜 케이스 (camelCase)
- 동사로 시작
- 예:
createRoom(),handleMessage(),sendAttack()
변수
- 카멜 케이스 (camelCase)
- 명사 사용
- 예:
playerName,roomId,currentTurn
상수
- 대문자 + 언더스코어 (UPPER_SNAKE_CASE)
- 예:
MAX_PLAYERS,DEFAULT_PORT,GAME_BOARD_SIZE
패키지
- 소문자만 사용, 언더스코어 지양
- 예:
com.hsu.byteship.server.controller
Enum
- 클래스명은 파스칼 케이스, 값은 대문자 + 언더스코어
- 예:
enum Mode { ENTER_LOBBY, GAME_START }
들여쓰기
- 4칸 스페이스 (탭 사용 지양)
중괄호
- K&R 스타일 (열리는 괄호는 같은 줄)
if (condition) {
// code
}빈 줄
- 클래스/메서드 사이 1줄
- 논리적 블록 구분에 사용
public class Example {
// 1. 상수
private static final int CONSTANT = 10;
// 2. 필드 (static → instance, public → private)
private static int staticField;
private int instanceField;
// 3. 생성자
public Example() { }
// 4. 메서드 (public → private, static → instance)
public void publicMethod() { }
private void privateMethod() { }
}JavaDoc 주석
- public 클래스/메서드에 JavaDoc 작성
/**
* 방을 생성하고 플레이어를 추가합니다.
*
* @param roomName 방 이름
* @param host 방장 플레이어
* @return 생성된 Room 객체
*/
public Room createRoom(String roomName, Player host) {
// ...
}인라인 주석
- 복잡한 로직에만 간단히 설명
- 코드로 설명 가능하면 주석 지양
예외 처리
- 구체적인 예외 타입 사용
- 예외 무시 지양 (최소한 로그 기록)
null 체크
- null 가능성이 있으면 명시적 체크
- Optional 활용 고려
메서드 길이
- 한 메서드는 한 가지 일만
- 가능하면 20줄 이내
클래스 책임
- 단일 책임 원칙 (SRP)
- Controller, Service, Model 역할 분리 유지
-
PR 시, 템플릿이 등장한다. 해당 템플릿에서 작성해야할 부분은 아래와 같다
-
PR 유형 작성, 어떤 변경 사항이 있었는지 [] 괄호 사이에 x를 입력하여 체크할 수 있도록 한다. -
작업 내용 작성, 작업 내용에 대해 자세하게 작성을 한다. -
추후 진행할 작업, PR 이후 작업할 내용에 대해 작성한다 -
리뷰 포인트, 본인 PR에서 꼭 확인해야 할 부분을 작성한다. -
PR 태그 종류, PR 제목의 태그는 아래 형식을 따른다.
-
[Feat]: 새로운 기능 추가[Fix]: 버그 수정[Design]: UI/스타일 파일 추가/수정[Refactor]: 코드 리팩토링[Chore]: 빌드 업무 수정, 패키지 매니저 설정 등[Docs]: 문서 추가/수정[Test]: 테스트 코드 추가/수정[Style]: 코드 포맷팅, 세미콜론 누락 등
🎉 [Chore] 프로젝트 초기 세팅
✨ [Feat] 프로필 화면 UI 구현
🐛 [Fix] iOS 17에서 버튼 클릭 오류 수정
💄 [Design] 로그인 화면 레이아웃 조정
📝 [Docs] README에 프로젝트 소개 추가
[Feat]: 새로운 기능 추가[Fix]: 버그 수정[Design]: UI/스타일 파일 추가/수정[Refactor]: 코드 리팩토링[Chore]: 빌드 업무 수정, 패키지 매니저 설정 등[Docs]: 문서 추가/수정[Test]: 테스트 코드 추가/수정[Style]: 코드 포맷팅, 세미콜론 누락 등
[Chore] 프로젝트 초기 세팅
[Feat] 프로필 화면 UI 구현
[Fix] iOS 17에서 버튼 클릭 오류 수정
[Design] 로그인 화면 레이아웃 조정
[Docs] README에 프로젝트 소개 추가
src/com/hsu/byteship/
├─ common/ # 공통 모듈
├─ server/ # 서버 모듈
└─ client/ # 클라이언트 모듈
각 모듈은 패키지 구조를 따라 계층적으로 구성됩니다.
과목: 네트워크프로그래밍
프로젝트명: Byteship - Battleship Network Game