[Spring] 리팩토링 - 객체 생성 방식
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) Ver.1서비스 계층에서 생성자를 통해 인스턴스 생성서비스 계층에서 비즈니스 로직 뿐만아니라 객체 생성 역할까지 수행또한 여러 메서드에서 동일한 객체를 생성해야 하는 경우, 코드가 불필요하게 중복됨객체 생성 로직이 변경되는 경우, 작성된 모든 코드를 찾아서 변경해야함CartItemEntity cartItem = new CartItem(targetType, targetId, amount); Ver.2엔티티 내부에 정적 팩토리 메서드를 작성하여 객체 생성의 책임을 엔티티에 둠Entity가 Dto의 구조를 알고있어서 의존하게 됨(결합도 증가)// Entitypublic static CartItemEntity create(CartItemDto c..
[Spring] @Scheduled와 JavaMailSender를 이용한 자동 메일 발송 기능
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 기능 구현 요구 사항사용자는 로또 예상 번호를 입력할 수 있다.이미 당첨 번호가 공개된 로또 회차는 입력 불가하다.매주 토요일 저녁 예상 번호와 당첨 번호를 비교한다.이메일 알림을 허락한 사용자에 한해서 이메일 발송을 진행한다.유저 테이블에 저장된 이메일 정보는 이미 검증이 완료 된 상태라고 가정한다.이메일에는 당첨 여부, 일치하는 개수 등의 정보를 기재한다.  Entity와 Dto, Repository 코드는 더 이상 보여줄 필요가 없을 것이라 생각되어서 사용한 주요 Spring 기능 소개와 적용한 로직의 일부만을 포스팅할 예정이다. JavaMailSender스프링 프레임워크에는 이메일을 쉽게 보낼 수 있는 모듈인 Spring Boot ..
[Spring] 장바구니 기능 구현
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 구현하려는 장바구니 기능의 요구사항은 다음과 같다.사용자는 두 종류의 장바구니를 가진다. IsLotto(true : 금액 제한 장바구니, false :  무제한 장바구니)장바구니 사용자는 현재 인증된 토큰을 기반으로 찾는다.장바구니 상품 추가 시엔 상품 id, 상품 수량, IsLotto 값, 상품 종류(enum) 값이 필요하다.장바구니 물품 id를 반환해준다.isLotto가 true 일 경우, 담은 금액이 제한 금액(최신 회차 로또 실수령액)을 넘길 경우 에러를 반환한다.장바구니 조회 시엔 IsLotto 값이 필요하다. (default : true)조회할 장바구니가 없다면 새로 생성한다.장바구니 상품 제거 시엔 장바구니 물품 id 값이 필..
[Spring] 로또 API 단위 테스트 코드 작성
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)  일반적으로 테스트 케이스를 작성한다고 하는건 거의 단위 테스트를 의미하는 것이다.통합 테스트는 여러 컴포넌트들 간의 상호작용과 호환성을 검증하는 테스트이기 때문에 테스트를 위한 비용이 많이 소모된다. Java를 테스트 할 때 가장  흔히 사용되는 프레임워크인 JUnit을 사용해서 단위 테스트를 진행할 예정이다. 단위 테스트 : 하나의 모듈을 기준으로 독립적으로 검증하는 테스트 (controller, service, repository, ...)테스트 코드 실행 시간이 빠름하나의 테스트가 곧 하나의 문서로 역할독립적인 검증이기 때문에 다른 객체와의 상호작용 필요시 가짜 객체를 정의해 주어야 함가짜 객체의 답변을 직접 작성해주는 것이기 때문..
[Spring] 테스트 코드 기본 개념
·
Dev Tool/Spring boot
테스트 코드 개념API를 개발하면서 swagger나 postman을 통해 개발 사항에 대한 테스트를 진행해 볼 수 있다. 하지만 이렇게 수동적인 테스트는 관리해야할 api가 늘어나고, 요구사항이 변경되게 될수록  커버하지 못하는 영역이 늘어나게 된다. 이를 위해 필요한게 테스트 코드이다. 테스트 코드를 통해 개발자는 빠른 피드백을 얻을 수 있으며, 테스트 케이스 수행을 자동화할 수 있다. 이에 따라 코드의 안정성이 높아져 소프트웨어 품질 유지에 도움이 되는 것이다. 테스트 코드 규칙이러한 테스트 코드는 다음과 같은 규칙들을 지키며 작성할수록 좋은 테스트 코드라 불려진다FIRST 원칙Fast :  빠르게 실행Isolated : 테스트 코드 성공 유무가 다른 테스트에 영향을 끼치지 않음Repeatable :..
[Spring] 로또 API 구현(2) & 예외 처리(@validate)
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 이번 API는 각 년도별로 누적된 로또 번호의 통계치를 제공해주는 api이다. 크게 보면 Lotto정보에 속하는 것이기 때문에 service와 controller 코드를 같은 클래스에 작성하였었으나, 단일 책임 원칙에 따라 분리하여 작성하였다. 코드를 작성하면서 팀원이 작성해둔 예외처리메서드를 사용하여 예외처리를 진행해주었다. try-catch 사용은 최대한 지양하는게 좋다는 말을 들어왔기에 throw하여 @RestControllerAdvice에서 받게끔하였다. Entity & DTO@Getter@Setter@Mapping(mappingPath = "statnum-mapping.json")@Setting(settingPath = "elas..
[Spring] Swagger 연동
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)Swagger를 사용하면 개발한 API들을 한 곳에 모아볼 수 있고, 테스트도 가능하다. 현재 spring-fox, spring-doc 두가지의 swagger 라이브러리가 존재하는데 이 중 spring-doc을 사용하여 연동을 진행하였다. 구글링을 해보면 Swagger와 Springboot를 연결한 많은 사례가 존재하는데 하나의 사례만 따라하면 계속 에러가 떠서 여기저기 짜집기를 해가며 연동을 했다. 이후 다시 연동을 할 때 다시 시간 잡아먹히긴 싫으니까 기록!!  build.gradleimplementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'application.yml..
[Spring] 엘라스틱 서치 연동 & API 구현
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 현재 개발하고자 하는 서비스는 흔히들 하는 상상인 '로또 당첨되면 뭐하지?'를 실제로 체험해볼 수 있는 로또 시뮬레이션 웹이다. 이에 필요한 api명세는 다음과 같다. 나는 로또와 장바구니 관련된 API 구현 & 서버 배포 및 CICD 구현을 담당하였다. 이에 대한 개발 과정을 포스팅할 예정이다.엘라스틱 서치 연동 ES 사용 이유와 대략적인 개념 정리구현하고자 하는 서비스는 조회가 대부분의 기능을 이루는 서비스이다. 이 때문에 당연히 검색 성능을 높이는 방법에 가장 집중을 많이 했다. 인덱싱과 반정규화 등등 여러 방안에 대해 얘기를 하다가 결정하게 된 것이 엘라스틱 서치였다. 엘라스틱 서치는 분산형 RESTful 검색 및 분석 엔진이다. ..
[Spring] 프로젝트 생성 기초
·
Dev Tool/Spring boot
Spring 프로젝트 생성spring boot 프로젝트는 보통 다음 사이트에서 생성하는게 일반적이다.  https://start.spring.io/다음과 같은 값으로 지정하여 프로젝트를 생성하였다. 의존성들은 필요하다고 생각되는 것들은 모두 추가해놓았는데 추후 더 필요하게 되면 추가 가능하니 많이 신경쓰지 않아도 될 듯 하다. 주요 라이브러리스프링 부트 라이브러리spring-boot-starter-web :  웹 애플리케이션 개발을 위한 필수 라이브러리 모음으로 내장 톰캣 서버와 스프링 mvc 설정이 포함됨spring-boot-starter-tomcat : 스프링 부트 내장 웹 서버spring-webmvc : 스프링 웹 MVC를 구성하는 라이브러리spring-boot-thymeleaf : 타임리프 템플릿..
[Python] Input/Output
·
프로그래밍/Python
데이터 입력파이썬은 데이터를 입력받을때 Input() 함수를 사용하는데 해당 함수는 기본적으로 데이터를 문자열로 입력받는다. a = input() # hello 입력print(a) # hello 출력a = input() # 123 입력print() # 123 출력 값을 원하는 형태의 자료형으로 입력받고 싶을 땐 다음과 같이 원하는 자료형을 앞에다 붙여주면 된다.a = int(input())b = int(input(),8) # 8진수를 입력받는 형태.c = int(input(),2) # 2진수를 입력받는 형태. 1010을 입력하면 십진수인 10이 할당됨l = list(input()) # abcde 입력print(l) # ['a','b','c','d','e'] 출력 단일 값이 아닌 여러 값을 ..
[운영체제]🦖공룡책🦕3장 - 프로세스(1)
·
CS
3장 학습 목표프로세스 개념에 대해 학습프로세스 스케줄링 방식 학습프로세스 생성과 종료 연산프로세스 간 통신 방법 학습IPC 시스템 학습클라이언트 서버 환경에서의 통신에 대해 학습프로세스 개념 (Process Concept)초기의 컴퓨터 시스템은 한 번에 하나의 프로그램만을 실행하도록 허용했었다. 하지만 시간이 흘러 오늘날 시스템들은 메모리에 다수의 프로그램이 적재되어 병행 실행 되는 것을 허용한다. 이러한 발전이 실행 중인 프로그램을 뜻하는 프로세스란 개념을 낳았다.프로그램이 컴파일 된 코드와 같은 명령어 리스트들을 포함하는 정적인 개체라면, 프로세스는 메모리 구조를 이루어 현재 활동 상태를 나타내는 등의 동적인 정보를 가지는 동적인 개체인 점을 기억해두자. (프로그램 카운터 값을 통해 현재 어떤 명령..
[운영체제]🦖공룡책🦕2장 - 운영체제 구조(3)
·
CS
https://seung2344.tistory.com/112 [운영체제]🦖공룡책🦕2장 - 운영체제 구조(2)https://seung2344.tistory.com/110 [🦖OS🦕]2장. 운영체제 구조(1)이 장의 학습 목표운영체제에서 제공하는 서비스 학습사용자 인터페이스 종류에 대해 학습서비스를 제공하기 위한 시스템 콜을 사용하seung2344.tistory.com 운영체제에서 제공하는 서비스 학습사용자 인터페이스 종류에 대해 학습서비스를 제공하기 위한 시스템 콜의 종류에 대해 학습링커와 로더에 대해 학습운영체제 설계를 위한 모놀리식, 계층화, 마이크로 커널, 모듈 및 하이브리드 전략에 대해 학습운영체제 성능을 모니터링 하기 위한 도구 학습운영체제 성능 모니터링에 관련한 내용은 XV6를 사용한 간..