회원가입 시 사용자가 입력한 닉네임 뒤에 #0000 과 같은 Suffix를 붙여야한다는 요구사항이 있다. 뒤에 네 자리 숫자는 난수를 생성하기 위해 Random 객체를 사용했다. public class IdentifierProvider { private static final String NICKNAME_IDENTIFIER_PREFIX = "#"; private static final int DIGIT = 4; private static final Random random = new Random(); public static String create(){ final StringBuilder identifier = new StringBuilder(NICKNAME_IDENT..
들어가기프로젝트 팀원분께서 DTO클래스에 Record를 사용해보는게 어떻겠냐고 하셔서 바로 Record 클래스에대해 알아보기 시작했고, 과연 데이터를 실어 나르는데 적합한지 알아봤다. Record ClassJDK 14에서 미리보기형태로 등장한 Record 클래스는 JDK 16에 정식 스펙으로 등록됐다. 1. Final Class로 상속이 불가능하다.2. 불변객체이다 -> 모든 필드가 private final로 정의된다.3. 중복되는 코드들[Getter, Setter, HashCode, Equals 등] 컴파일 타임에 자동으로 생성된다. 한 마디로 코드가 깔끔해진다.public record UserSignUpRequest( @Size(min = 5, message = "아이디는 5자 이상이여야..
들어가기 테스트하기 쉽다고 좋은 함수, 좋은 설계는 아니지만 좋은 함수, 좋은 설계는 테스트하기 쉽다. 여기저기서 많이 들어볼 수 있는 말이다. 아직 테스트 코드를 많이 작성해보지 못했고 공부하는 과정이라 저 말이 잘 와닿지는 않는다. 아주 조금씩 이 말을 깨달아가고 있고 그 과정을 남겨보려 한다. 어려운 테스트, 좋지 못한 설계 진행 중인 프로젝트에서 회원의 관심분야를 등록, 수정, 삭제할 요구사항이 생겼다. 처음엔 아래와 같이 Service 레이어를 구현했다. @Transactional public void saveInterests(InterestsRequest interestsRequest, UserDetails userdetails) { User user = userRepository.findBy..
아래 코드를 한 번 살펴보자. Integer c = Integer.valueOf(127); Integer d = Integer.valueOf(127); System.out.println("c.hashCode() = " + c.hashCode()); System.out.println("d.hashCode() = " + d.hashCode()); System.out.println("System.identityHashCode(c) = " + System.identityHashCode(c)); System.out.println("System.identityHashCode(d) = " + System.identityHashCode(d)); System.out.println("(c==d) = " + (c==d));..
들어가기 계층형 아키텍처에대해서 검색을 해보던 중에 이동욱 개발자님의 포스팅을 보게 됐다. 계층형 아키텍처 학교 다닐때 잠깐 JAVA 관련 수업을 들은적이 있다. 그때 수업 내용은 넷빈즈(Netbeans) IDE를 통해 JAVA로 윈도우 애플리케이션을 만드는 것이였다. 간단한 시간표 관리 프로그램을 만드는 과제는 얼 jojoldu.tistory.com 전체 글을 절반 쯤 읽던 중 Rich Domain Model에대한 이야기가 나왔고, 사실 처음 들어봤다... 그래서 글을 읽다 말고 1시간 40분 짜리 동영상을 시청하게됐다. 왜 이제서야 봤는지 후회가 될 정도였고 이 내용을 잘 정리해두려한다. eternity-oop - Overview eternity-oop has 4 repositories availab..
들어가기 지난 포스팅에선 Http 요청 메세지의 가장 마지막에 EOF가 없어 bufferedReader.readline()이 무한 대기 상태에 빠졌었다. EOF는 클라이언트의 연결이 종료돼야 날아오기 때문에 EOF를 기준으로 body를 읽을 수 없었다. 대신 HttpHeader의 Content-Length를 이용해 body를 가져올 수 있다. HttpMessage의 Header를 파싱하자 BufferedReader에서 Header와 Body의 경계인 CRLF까지만 읽도록 한다. public class WebServer { //생략 private static final Map httpHeader = new HashMap(); //생략 } private static void parseHttpRequestHe..
들어가기 이번엔 클라이언트의 HTTP 메세지를 받아 서버측에서 출력해보자. HTTP 메세지를 BufferedReader로 출력하는 과정에서 Body를 출력하지 못하고 무한정 대기하는 상황이 있었다. 정리를 해보자. 클라이언트 HTTP 요청 클라이언트는 저번과 같이 http://localhost:8081 에서 기동중이다. 아래는 클라이언트 코드다. shot() { var dataToSend = 'Hello Server'; fetch('http://localhost:8080', { method: 'POST', headers: { 'Content-Type': 'text/plain', }, body: dataToSend, }) .then(function (response) { if (!response.ok) {..
들어가기 C언어를 이용해 네트워크 프로그래밍 수업을 들으며 처음으로 소켓을 이용한 통신을 주고 받아 봤다. 나도 모르는 사이 많은 응용 프로그램을 이용하면서 소켓을 사용했겠지만, 그 내부를 공부하고 구현해 본적은 당연히 없었다... C언어를 통해 윈도우 소켓 프로그래밍을 해보았지만, 자바/스프링 개발자가 되고싶은 나에겐 자바로 소켓 통신을 구현해보고 싶은 생각이 들었고 지금 해보려한다. 소켓 생성 public class WebServer { private static final Logger logger = LoggerFactory.getLogger(WebServer.class); private static final int DEFAULT_PORT = 8080; private static final int..