이번 포스팅에서는 MVC 패턴에 대해 이야기할 것이다. 제목에서도 나와있듯이 이론은 많은 블로그들에서 정의되어있어 찾아보기가 쉬울 것이다. 여기서는 이론보다는 실제 코드에 어떻게 MVC 패턴을 적용할 수 있는지 알아본다. 모든 내용은 테크톡을 참고하였다. 또한 모든 코드는 프리코스 3주차 로또 게임을 진행하면서 구현한 코드임을 알립니다. Model은 Controller와 View에 의존하지 않아야 한다. 첫번째 규칙은 Model은 Controller와 View에 의존하지 않아야 한다. 의존하지 않아야 한다라는 말을 바꿔 말하면 Model 내부에 Controller나 View와 관련된 코드가 존재해서는 안된다는 뜻이다. 그 이유는 Model은 데이터를 관리하는 곳이기 때문에, 사용자에게 보여지는 UI 로직..
이번 포스팅에선 3주차 과제를 진행하면서 배운 내용, 아쉬웠던 점과 느낀 점을 쓴다. 2주차 회고는 너무 코드 위주로 설명을 해서 아쉬웠다. (회고록을 어떻게 써야하는지 몰랐었다.) 이제라도 회고다운 글을 써볼까 한다. 그럼 배운내용부터 작성하도록 하겠다. 도메인 단위 테스트를 할 때는 하드코딩을 할 것 3주차 추가된 요구사항에서 도메인 로직에 단위 테스트를 구현하라고 했다. 단위 테스트가 처음은 아니지만, 도메인 로직을 단위 테스트로 구현하는 것은 처음이었기에 어떻게 작성해야할지 고민이었다. 정확한 해답 없이 코드를 구현하고 있을 때, 이동욱님의 블로그글을 보면서 한가지 깨달은 점이 있다. 아래코드는 한 가지 문제점이 있는 코드다. @DisplayName("Lotto용지가 생성되는지 확인") @Test..
미션 - 숫자 야구게임을 참고해주세요. (회고 말고 코드 설명을 한다라고 보시면 될 것 같습니다.) 클래스보다 객체의 속성과 행위가 우선이다 클래스는 객체를 추상화하는 도구일 뿐이다. 그럼 먼저 주요 객체들을 알아보자. 구현해야할 게임은 숫자 야구게임으로, 큰 흐름을 생각하면 다음과 같다. 1. 컴퓨터가 랜덤한 3자리 숫자를 생성한다. 2. 게임을 하는 사람은 3자리 수를 입력한다. 3. 입력한 3자리 수에 대한 힌트를 출력한다. 4. 위 과정을 반복한다. 5. 만약 3자리 수가 모두 일치한다면 게임종료를 알리고 재시작 여부를 묻는다. 6. 재시작을 요청하면 재시작을, 종료를 요청하면 종료한다. 위 과정을 프로그래밍적으로 생각하기 전에 현실적으로 봐보자. 우선 3자리 숫자를 생성하는 컴퓨터가 필요할 것 ..
이번 포스팅에서는 저번주 금요일부터 토요일까지 마이다스 기업에서 진행되었던 해커톤에 참여하게 된 계기와 본선 진출, 그리고 3등까지 하게 된 이야기를 하려고 한다. 해커톤에 참여하기까지의 이야기는 짧게 말하고, 구현에 대해서 좀 더 깊게 말할 예정이다. 해커톤에 참여하게 된 계기 현재 부산소프트웨어마이스터고를 다니고 있다. 부산소프트웨어마이스터고등학교와 협약을 맺은 기업들이 많은데, 그 중에서 가장 좋다고 알려진 기업들이 마이다스, 우아한형제들이 있다. 우아한형제들은 협약을 맺었다고는 하지만 다른 기업들과 다르게 채용하지 않고 그냥 지켜보는 느낌인 것 같다. 그래서 선생님들은 이 학교의 최고 아웃풋이 마이다스라고 말하고, 마이다스에 가고 싶은 학생들도 많았다. 마이다스에서는 매년 마이스터 학생들을 몇명 ..
어제 배포를 위해서 ssh를 만지다가 잠이 들었다. 아침에 일어나서 하던 작업을 이어가려고 ssh에 접속하려 했더니 아래 문구가 떴다. ssh: connect to host 탄력적 IP port 22: Operation timed out ssh에 접속하지 못하고 타임아웃이 떴는데, 인바운드 규칙에서 내 IP 주소를 추가해주지 않아서 발생한 것이다. 그럼 추가해주자. 보안그룹에 들어가서 생성을 한다. 이름과 설명은 막 지어도 상관없다. (물론 연습이니까 그렇다. 실무에서 막 지으면 안될 수 도 있다) 그리고 인바운드 편집에서 아래와 같이 추가해주자. 그리고 보안그룹을 생성한다. 이제 자신이 만든 ec2에 보안 그룹을 추가하기만 하면 된다. 자신이 만든 인스턴스를 체크한 후 작업 -> 보안에 보안 그룹 변경..
1. takeWhile() takeWhile은 인자 값이 false라면 스트림을 중단하는 중간 연산자이다. 쉽게 생각하면 for문을 돌릴 때 break를 거는 것과 비슷하다. 이 연산자는 아래와 같이 많이 쓰인다. .takeWhile(Objects::nonNull) Objects.nonNull()은 인자값이 null이 아니면 true를 반환해준다. 예시를 들어서 아래 코드가 있다고 가정해보자. users.stream() .takeWhile(Objects::nonNull) users는 List 필드변수다. users를 돌면서 User 객체가 null이 아니면 돌다가, User 객체가 null인 순간 Objects.nonNull()에서 false를 리턴하고, false를 받은 takeWhile은 Stream..
모든 코드는 깃허브에 있습니다. Docker Compose없이 컨테이너 실행 Docker Compose가 뭔지 알아보기 전에 간단하게 mysql이미지로 컨테이너를 실행한 후 Spring boot와 연동해보도록 하겠다. 먼저 mysql이미지를 만들어보자. docker pull mysql 이미지를 다운받은 후 컨테이너를 생성하여 실행해보자. 코드는 다음과 같다. docker run -d -p 13306:3306 --name test_mysql -e MSQL_ROOT_PASSWORD='자신의 mysql 비밀번호' mysql 마지막으로 Spring boot와 연동만 하면 끝이다. 연동하는 방법은 간단하다. datasource: driver-class-name: com.mysql.cj.jdbc.Driver url..
이번시간에는 도커를 실행할 때 발생하는 에러들과 해결법을 알아보겠다. 모든 코드와 설명은 해당 블로그를 참고했다. 블로그가 2017년에 작성된것이라 아무래도 오류가 많았다. M1 맥에서 mysql 이미지 다운로드 및 실행 블로그에서의 명령어는 다음과 같다. docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7 하지만 에러가 뜬다. 검색해보니 Apple 실리콘이 탑재된 컴퓨터에서는 옵션을 붙여주어야 한다고 한다. 옵션 명령어는 다음과 같다. --platform linux/amd64 따라서 아래 명령어를 입력하면 정상적으로 실행이 될 것이다. 이름 옵션에서는 자신이 원하는 이름을 지어주어도 상관없다. docke..
도커 설치와 실행이 처음이라 어색한 부분이 많습니다 ㅠㅠ 도커 설치하기 먼저 도커를 설치해보자. 도커 독스에서 아래 버튼을 눌러준다. Mac이 아니라면 여기를 참고하자. Apple 실리콘이 탑재된 Mac이라면 아래 명령어를 입력한다. 다운로드 전에 해도 명령어를 입력해도 상관없다. softwareupdate --install-rosetta Rosetta는 기존의 Intel 기반에서 동작하는 앱을 Apple 실리콘이 탑재된 컴퓨터에서 자동으로 실행해주는 도구다. 도커 문서에서는 Docker Desktop 4.3.0부터 Rosetta 2 설치를 적극 권장하고 있다. 적극 권장하는 이유는 일부 명령어들이 Rosetta 2를 설치하지 않으면 제대로 작동하지 않기 때문이다. 또 다른 문제점은 기존 Intel 기반..
AOP에 대한 개념과 실전예제를 참고해주세요. 모든 코드는 깃허브에 있습니다. 문제 AOP를 사용하여 domain 패키지 안의 모든 요청에서 파라미터의 타입과 값을 찍으려고 했다. 코드는 다음과 같다. @Pointcut("execution(* com.motivation.mojaty.domain..web.api..*.*(..))") private void cut() {} @Before("cut()") public void before(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); for(Object obj : args) { log.info("type = {}", obj.getClass().getSimpleName()); log.info("valu..
- Total
- Today
- Yesterday