전체 글
[Java] 로또 (객체 지향 편)
우테코 5기 3주차 미션을 다시 설계하고 객체 지향 프로그래밍을 연습을 초점에 맞추어 글을 써봅니다. 입출력의 요구사항 설계는 생략 하니 이점 양해 부탁 드립니다. 우선 프로그래밍 요구사항을 살펴보고 개념 또는 도메인을 정해 역할을 부여해보자. 🚀 기능 요구 사항 로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다. `로또 번호의 숫자 범위는 1~45까지이다. 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다. 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다. 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다. - 1등: 6개 번호 일치 / 2,000,000,000원 - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,00..
[Java] 숫자 야구 게임 (객체 지향 편)
우테코 기간에 했던 미션들을 다시 리팩터링하고 객체 지향 프로그래밍에 대해 연습해보고자 2주차에 진행 하였던 숫자 야구 게임에 대해 적어보겠습니다. 먼저 아래와 같은 기능 요구사항이 있는데 어떠한 개념들이 어떤 역할을 하는지 정리해봅시다. 🚀 기능 요구 사항 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 : 1스트라이크 456을 제시한 경우 : 1볼 1스트라이크 789를 제시한 경우 : 낫싱 위 숫자 야구 게임에서 상대방의 역할을..
[오브젝트] 결합도를 줄여보자
개발을 하다보면 기능 동작을 구현하고 나만 알기 쉬운 코드(암호문?) 가 된다. 각 객체에 의존성이 높아지며 스파게티 코드가 된다. 이번 우테코 5기 프리코스를 지원하여 미션을 진행하다 많이 부족한 부분들을 정리하고 오브젝트 책을 참고하며 글을 써봅니다. 먼저 소프트웨어의 모듈이 가져야하는 기능은 아래 3가지와 같다. 모듈이 가져야 하는 3가지 기능 제대로 동작해야 한다. 변경이 자유로워야 한다. 가독성이 좋아야 한다. 예제 코드를 보면서 이해해보자. 관람객이 가지고 있는 가방에 초대장이 있으면 티켓을 주고 없으면 티켓 금액을 지불하여 티켓을 구매하는 코드다. public void enter(Audience audience) { if (audience.getBag().hasInvitation()) { T..
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 상태코드
상태코드 HTTP API 에 대해 클라이언트가 요청을 보내면 서버측에선 응답 메시지를 보내준다. 응답 메시지 안에 상태코드가 포함 되어 있다. 이 상태코드를 통해서 서버에서 어덯게 처리되었는지를 추측할 수 있다. 1xx(informational) 요청이 수신되어 처리중이다. 2xx(successful) 요청이 정상적으로 처리되었다. 200(OK) GET과 같은 조회 요청에 성공적으로 응답하는 경우 201(Created) POST 와 같은 생성요청으로 리소스가 생성이 정상적으로 된 경우에 해당한다. 응답 메시지에는 생성된 리소스 식별자가 Location 필드에 추가되어 응답된다. 202(Accepted) 요청은 서버에서 받았으나 아직 처리가 되지 않은 경우 204(No Content) 서버에서 요청은 성공..
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 메서드 활용
데이터 전달 방식은 2가지로 구분 쿼리 파라미터를 통한 데이터 전송 주로 GET을 사용한다. 검색, 정렬 필터에 사용한다. 메시지 바디를 통한 데이터 전송 POST, PUT, PATCH 를 사용한다. 회원가입, 상품 주문, 리소스 등록, 변경에 사용한다. 데이터 전달은 5가지로 구분 정적 데이터 조회 이미지, 정적 테스트 문서 동적 데이터 조회 주소 검색, 게시판 목록에서 정렬 필터(검색어) HTML FORM 을 통한 데이터 전송 회원가입, 상품 주문, 데이터 변경 HTTP API를 통한 데이터 전송 서버 to 서버, 앱 클라이언트, 웹 클라이언트(Ajax), 회원가입, 상품주문, 데이터 변경 정적 데이터 조회 조회는 GET을 사용 쿼리 파라미터는 사용하지 않고 리소스 경로로 단순하게 조회한다. 동적 데..
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 메서드
API URI 설계 시 포인트 가장 중요한 것은 리소스 식별이다. 리소스란? 동작을 제외한 자원 그 자체를 리소라 한다. 행동은 제외가 되며 예를 들어 삭제, 추가, 수정 등 이러한 행위들은 제외다. 기본적으로 조회 URI를 보면 GET /members/{id} 로 구성한다 계층 구조상 상위 자원을 컬렉션으로 보기에 복수형으로 사용하는 게 좋다. HTTP 메서드 GET 서버에 전달되는 데이터는 query string 을 통해 전달된다. ex) hello=hi&hello=hi 메시지 바디는 사용이 가능하지만 지원되지 않는 곳이 많아 권장하지 않는다. POST 메시지 바디를 통해 서버로 요청 데이터를 전달하면 서버는 해당 데이터를 받아 처리한다. 주로 등록 혹은 프로세스 처리 등에 사용된다. 리소스 등록 서..
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 기본
Stateful, Stateless 비 연결성 ( connectionless ) HTTP 메서드 무상태 프로토콜 ( Stateless ) 상태를 보존하지 않는 다는 뜻이다. 이러한 상태의 단점은 클라이언트에서 서버에 전송 한 정보여도 서버에서는 클라이언트의 상태를 저장하지 않아 계속해서 서버의 원하는 정보를 전송해야 한다. Stateless 상태는 서버의 확장 ( scale out ) 이 쉽다. 어떠한 이벤트 때문에 클라이언트의 요청이 많아진다면 미리 서버를 많이 증설할 수 있다는 뜻이다. 상태유지 ( Stateful ) Stateful 상태면 클라이언트에서 보낸 정보를 서버에서 가지고 있어야 한다. 클라이언트의 정보를 가지고 있는 서버가 동작이 안된다면 해당 클라이언트 정보는 다른 서버가 가지고 있지 ..
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 기본 - 모든 것이 HTTP, 클라이언트 서버 구조
일반적으로 컴퓨터에서 필요한 데이터는 서버에 요청하여 받아오는데 우리는 네트워크 망을 통해 서버로부터 데이터를 가져오기 위한 통신을 한다. 이러한 통신은 HTTP 통신과 Socket 통신 2가지가 있다. HTTP (HyperText Transfer Protocol ) 하이퍼 텍스트를 주고 받기 위한 통신 규약 ( 규칙 ) 이다. HTTP 메시지 모든 형태의 데이터를 전송 할 수 있다. html, text image, 음성, 영상, 파일 json, xml(api) 서버 간에 데이터를 주고 받을 때도 대부분 http를 사용한다. TCP 프로토콜을 직접 사용해서 통신하는 경우는 게임 서버를 제외하고는 거의 없다. HTTP 기반 프로토콜 TCP UDP HTTP 특징 클라이언트 서버의 구조 무상태 프로토콜(Sta..
[모든 개발자를 위한 HTTP 웹 기본 지식]URI와 웹 브라우저 요청 흐름 - URI, 웹 브라우저의 요청 흐름
URI는 Uniform Resource Identifier의 약자로 URL과 URN을 포함한 큰 틀을 의미한다. URI ( Uniform Resource Identifier ) 리소스를 보여 줄 수 있도록 해주는 식별자 URL ( Uniform Resource Locater ) 리소스가 있는 위치를 지정 어떠한 자원에 대해서 위치와 어떤 자원을 원하는지 구체적으로 서술된 형태 인터넷에 접속 시 사용하는 주소 형식 URN ( Uniform Resource Name ) 리소스에 이름을 부여하여 리소스를 식별한다. 한계점 자원에 대해 이름만으로 리소스를 식별하는데에 한계가 존재 URL의 구조를 살펴보자 URL 구조 구조는 다음과 같다. scheme authority path query fragment sche..
[모든 개발자를 위한 HTTP 웹 기본 지식] 인터넷 네트워크 - PORT, DNS
Port 하나의 클라이언트에 여러대의 서버를 연결해야 한다면 IP 패킷의 정보만으로 어떤 서버에서 어떤 프로그램이 온 것인지 알 수가 없다. 이를 구분하기 위해 TCP / IP 패킷 정보에 port 번호를 추가로 제공하여 전달한다. IP 서버를 찾는 용도 port 서버 내부에서 돌아가는 프로그램을 구분하는 용도 포트 번호 ftp - 20, 21 telnet - 23 http - 80 https - 443 0 ~ 65535 할당 가능 0 ~ 1023 잘 알려진 포트, 사용하지 않는 것이 좋음 DNS ( Domain Name System ) 도메인 명을 IP 주소로 변환 시켜주는 시스템이다. 왜 DNS 가 나왔을까? IP 주소를 사용하는데 10자리 이상의 주소값을 기억하기가 어렵다. 또한 주소가 변경이 되면..
[모든 개발자를 위한 HTTP 웹 기본 지식] 인터넷 네트워크 - TCP, UDP
TCP IP 프로토콜의 문제점을 해결 인터넷 프로토콜 4 계층 그림 프로토콜 계층의 동작 순서 데이터를 전달하는 과정을 설명 1. 클라이언트에서 데이터를 전달 2. 데이터를 SOCKET 라이브러를 통해 OS계층에 전달한다. 3. TCP 계층에서 데이터를 포함한 TCP 정보를 생성한다. 4. IP 계층에서 전달 받은 TCP 정보를 IP 패킷으로 생성한다. 5. IP 패킷이 LAN 카드를 통해 나갈 떄 Ethernet Frame 이 포함되어 나간다. Ethernet Frame : LAN 카드의 MAC 주소 등 물리적 정보 TCP 정보가 추가되면서 IP의 한계점이 해결되었다. TCP(전송 제어 프로토콜) 특징 연결지향 - 3 way handshake 논리적 연결 후 메시지를 보낸다. 클라이언트가 서버에게 접속..
[모든 개발자를 위한 HTTP 웹 기본 지식] 인터넷 네트워크 - 인터넷 통신, IP(인터넷 프로토콜)
인터넷 통신은 어떻게 동작이 될까? 위의 그림을 보다시피 클라이언트와 서버간에 요청과 응답으로 동작하게 된다. 클라이언트와 서버가 가까이 있을 시 (같은 pc..) 다이렉트로 연결하여 통신을 할 수 있게 만들 수 있다. 하지만 서로 다른 pc 라면 클라이언트에서 요청을 보내어 통신 하려면 인터넷 망이라는 곳을 거처야 한다. 인터넷 망 내부에는 수많은 노드들이 존재한다. 어떠한 규칙으로 각 노드들을 거쳐 서버에 요청을 줄 수 있을까? 이 규칙은 인터넷 프로토콜이라 한다. 인터넷 프로토콜에 대해 알아보자. 인터넷 프로토콜 (IP) IP 는 주소라고 생각하면 되고 클라이언트와 서버에게 IP의 주소를 할당하여 패킷 통신 단위로 데이터를 전달 할 수 있다.. 아래 그림을 참고하자. IP 패킷 정보 위에서 말했듯 ..
[Spring] EventPublisher 를 알아보자
EventPublisher를 사용하여 알림 서비스를 만들 수 있다. 알림 서비스를 만들기 전에 EventPulisher에 대해 간단히 알아보자. ApplicationEventPublisher 는 ApplicationContext가 상속 받고 있는 인터페이스다. 해당 인터페이스를 사용하여 알림을 받는 간단 예제 코드를 만들어 볼 것이다. ApplicationEventPublisher 회원 가입이라는 이벤트가 발생 할 때 해당 이벤트를 받아 올 수 있다. MyEvent 클래스를 생성 이벤트 데이터로 가입자명 을 받을 것이다. public class MyEvent { private String createName; public MyEvent() {} public MyEvent(String createName)..
@Builder 사용시 초기화 필드는 어떻게 될까?
Account 클래스는 컬렉션을 참조하고 있고 null 방지를 위해 필드에서 초기화를 진행한 엔티티에 Tag 를 컬렉션에 추가하는 상황에 null 이 발생하는 이슈를 정리하는 글입니다. 아래와 같은 Account 클래스가 있다. @Builder @Entity public class Account { @Id @GeneratedValue private Long id; private String name; @ManyToMany private Set tags = new HashSet(); } 위의 Account 클래스를 빌더로 인스턴스를 생성하여 저장하고 Tag 도 저장한다. @DisplayName("계정에 태그를 추가하는 테스트") @Test @Transactional void addTag() { Accoun..
[Item 34] int 상수 대신 열거 타입을 사용하라
자바에서 열거 타입을을 제공하기 전에 정수 상수를 한 묶을 선언해서 사용했다. public static final int A = 1; public static final int B = 1; public static final int C = 1; 위와 같은 열거 패턴의 단점 타입 안전을 보장하는 방법이 없으며 표현력도 좋지 않다. A 라는 상수를 사용해야하는 메서드에 B 라는 상수를 사용해도 컴파일러는 해줄 수 있는게 없다. 동등성을 검증할 때도 경고 메시지를 출력하지 않는다. 상수의 값이 바뀌면 클라이언트도 반드시 다시 컴파일 해야한다. 상수의 갯수를 파악하기 어렵다. 문자열을 상수로 만들 경우 하드 코딩하게 만들기 때문에 안정적이지 못하다. 단점을 보완하기 위해 열거타입이 제공된다. public enu..