본문 바로가기

전체 글69

[회고] 우테코 6기 최종 합격 회고록 우아한 테크 코스 (이하 우테코)의 선발과정을 돌아보고, 경험을 공유하기 위해 회고록을 적어 본다. 우테코를 지원한 이유 나는 3학년때 방황을 했다. 혹시나 해서 말인데, 마냥 놀았다는 이야기는 아니다. 꿈을 찾아 복수전공한 컴퓨터학부였으나, 컴퓨터학부에서 갈라지는 분야는 너무 많았다. 내가 하고 싶은 것을 찾아야겠다고 생각했다. 많은 친구들이 AI로 진로를 정해 나아가고 있었기에 AI에 관심이 생겼다. 어떤 학문인지, 어떤 일을 하는지 등은 직접 겪어보기 전에는 알지 못하는 것이지 않은가? 그래서 나는 "경험해 보기 위해" 인공지능을 공부했다. 결과적으로 AI를 공부하고 있지는 않지만, 상관없다. 논문들을 읽으며 나는 코딩을 하고싶다는 것을 깨달았으니까. 사실 이제 와서야 말하는데, 근 1년간 나는 우.. 2024. 1. 4.
[JPA] 변경 감지와 @Transactional 문제 상황 회원 가입 이후 회원 정보 수정의 기능을 개발하고 있던 중, 수정을 시도한 정보가 제대로 저장되지 않는 문제가 발생했다. 회원 이름을 "유저" 에서 "다른유저"로 변경해도 변경이 되지 않는 것이었다. 현재 프로젝트는 SpringBoot를, DB는 MySQL - JPA를 사용하며, Repository 클래스는 JpaRepository를 사용하고 있었다. 문제 원인을 탐색하던 중, 혹시나 하는 마음에 Service의 값 수정 메서드에 @Transactional을 붙여주자 문제가 해결되는 것을 확인했다. 왜 저장, 삭제 로직과 다르게 값의 수정에 대해서는 Service 계층의 메서드에 @Transactional 어노테이션을 붙여야 정상 동작 하는 것일까?? 문제점 저장, 삭제 로직과 수정 로직의 차.. 2023. 12. 23.
상수 값 추출에 대하여 클린 코딩에 관심이 있는 개발자라면 모두 다음의 문장을 읽어본 적이 있을 것 같습니다. "매직 넘버, 매직 스트링을 상수로 선언하라." 상수 추출을 하는 이유 코드의 역할이 무엇인가? 그렇다면, 왜 매직 넘버, 매직 스트링을 지양하고 해당 값을 상수로 선언해야 하는 것일까요? 아래의 코드로 그 이유를 한번 살펴봅시다! private void validateNumberRange(int number) { if (number 45) { throw new IllegalArgumentException(); } } 해당 코드의 역할이 무엇인지 짐작이 가나요? "숫자가 1 ~ 45 사이의 값인지를 검증해 주는 코드입니다." 라고 한다면, 그건 프로그램을 조금이라도 다뤄 봤던 사람이라면 모.. 2023. 12. 3.
[Java / enum] - 왜 enum이 상수 클래스보다 더 좋은건데?? 서론 안녕하세요, 우테코 6기 백엔드 지원자 Zangsu 입니다! 우선, 글을 작성하기 전 미리 말씀 드리자면, 저는 대부분의 상수를 별도의 클래스를 생성해 관리하고 있었는데요. 그 이유는 다음과 같습니다. 1. 열거형은 하나의 논리적인 그룹에 포함되는 값들을 열거하기 위해 사용해야 한다. 모든 상수를 하나의 'enum'에 몰아 둔다면, 서로 관심사가 어중간하게 다른 값들이 하나의 "열거형" 이라는 그룹에 위치하게 되는데, 이는 올바른 책임 분리라고 생각하지 않았습니다. 2. 'enum'을 사용하게 되면 상수 클래스에 비해 값을 가지고 오는 코드가 길어진다. 이건 정말 사소한 취향인데요. 상수 클래스를 사용한다면 값을 가지고 오는 코드는 다음과 같을겁니다. 'ClassName.constName' 반면, .. 2023. 11. 15.
[1주차/숫자야구] 3. getter을 사용하는 대신 객체에 메시지를 전달하기 이번 포스팅은 리팩토링 과정을 담았다. 리팩토링 이전 리팩토링을 진행하기 전의 한 번의 게임 흐름을 간단하게 살펴보자. //Game.java public void play() { Result result; computer.init(); do { System.out.print("숫자를 입력해주세요 : "); List input = player.getInput(); result = computer.getResult(input); System.out.println(result); } while (result.getStrike() != 3); System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } 우리는 Computer 객체와 Player 객체의 각각의 메서드를 호출하며 전체 .. 2023. 10. 23.
[1주차/숫자야구] 2. 테스트코드로 입력에 대한 예외 처리 하기 Player 클래스에서 Consoles 클래스로 사용자의 입력을 처리하고, 잘못된 입력에 대해선 IllegalArgumentException을 발생시켜 주었다. 이제, 내 로직이 예상과 같이 동작하는지 확인하기 위해 테스트 코드를 작성할 차례이다. 그런데, 테스트 코드를 실행할 때 마다 직접 입력을 넣어주는 것은 비효율적이기에, 테스트코드 자체적으로 사용자의 입력을 대신할 입력 처리를 해 주어야 했다. 처음 시도했던 것은 System.setIn() 메서드를 통해 직접 입력을 처리해 주는 것이었다. 그런데, setIn() 메서드가 익숙하지 않은 탓인지, 첫 번째로 실행되는 테스트를 제외한 모든 테스트가 입력을 정상적으로 처리해 주지 못했다. 즉, Consoles.nextLine()을 통해 값을 가지고 와야.. 2023. 10. 21.