ALL Post 204

연습용 주문 서버 만들기 02 멤버십 발급 API 작성하기

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API 가장 간단한 아이디 발급 API부터 만들겠습니다. 지난 번 글에도 말했듯이 편의상 회원가입없이 아이디 발급 요청하면 임의의 UUID를 발급하겠습니다. 이 아이디를 membership이라고 하겠습니다. 사용자는 나중에 발급받은 membership를 가지고 포인트를 충전하거나 결제할 수 있습니다. 구현할 요구사항은 아래와 같습니다. 사용자는 누구나 membership 발급 API를 통해 멤버십 번호를 발급받을 수 있다. 따로 무엇을 검증하지 않을 것이므로 매우 간단한 구현이 되겠습니다. 아이디 발급은 실패하는 케이스가 없다고 가정하겠습니다. ..

Spring 2023.01.15

연습용 주문 서버 만들기 01 Kotlin/Spring 멀티모듈 프로젝트 구성

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API Kotlin + Springboot로 주문 서버를 만드는 연습을 해보겠습니다. 최대한 간략하게 구성하기 위해 아래 네 개의 API만 만들겠습니다. 아이디 발급 API 편의상 회원가입 없이 아이디 발급 요청하면 임의의 아이디 발급 메뉴 조회 API 포인트 충전 API 결제 API 이번주 인기 메뉴 API 요구 사항 누구나 고유한 아이디를 발급 받을 수 있습니다. 누구나 메뉴를 조회할 수 있다. (메뉴 등록은 안 만들겠습니다.) 고유한 아이디에 포인트를 충전할 수 있다. 한 아이디를 여러 명이서 쓸 수도 있기 때문에 동시성을 고려해보겠습니다...

Spring 2022.12.22

가상 요소 셀렉터로 신규 등록 게시물 NEW 표시하기

가상요소 셀렉터 가상 요소란? 가상 요소란 HTML에 정의도지ㅣ 않은 요소를 CSS로 새롭게 만들어낸 요소다. 가상 요소 사용법 CSS에서 태그, 클래스, ID 셀렉터 뒤에 ::before , ::after 를 붙여 content 속성과 조합한 후 가상 요소를 만든다. content 속성에는 해당 위치에 넣고 싶은 텍스트나 이미지 등 콘텐츠를 적는다. content 속성으로 표시한 텍스트는 선택 및 복사 붙여넣기를 할 수 없다. 즉, 스크롤이 안 된다. 스크롤을 지원해야 한다면 가상요소 콘텐트 대신 HTML 텍스트를 사용해야 한다. before와 after ::before 는 요소 앞에, ::after는 요소 뒤에 가상 요소를 삽입한다. 가상 요소 셀렉터로 신규 등록 게시물 NEW 표시하기 HTML 가상..

Study/HTML,CSS 2022.12.19

[오브젝트06] 메시지와 인터페이스

클라이언트-서버 모델 협력은 어떤 객체가 다른 객체에게 무언가 요청할 때 시작된다. 메시지는 객체 사이의 협력을 가능하게 하는 매개체다. 객체가 다른 객체에 접근할 수 있는 유일한 방법은 메시지를 전송하는 것뿐. 객체는 희망하는 일을 메시지라는 형태로 전송하고, 수신 객체는 요청을 적절히 처리한 뒤에 응답한다. 이 메시지를 매개로하는 요청과 응답의 조합이 두 객체 사이의 협력을 구성한다. 두 객체 사이의 협력 관계를 설명하기 위해 사용하는 전통적인 메타포는 클라이언트-서버 모델이다. 협력 안에서 메시지를 전송하는 객체를 클라이언트, 메시지를 수신하는 객체를 서버라고 부른다. 협력은 클라이언트가 서버의 서비스를 요청하는 단방향 상호작용이다. 영화 예매 시스템이 있다면 이런 협력 관계를 가질 수 있다. Sc..

Study/오브젝트 2022.11.30

[요약] 한 개의 메소드만 갖는 계층형 컨트롤러/서비스 패키지 스타일 - 기계인간 John Grib

방대한 서비스 클래스를 어떻게 잘 나눌 수 있을까? 고민한 적 많았는데 우연히 이 글을 읽었다. 기회가 되면 실제 프로젝트에 적용해보고 싶다. (기록) 한 개의 메소드만 갖는 계층형 컨트롤러/서비스 패키지 스타일 - 기계인간 John Grib 요약 한 개의 메소드만 갖는 계층형 패키지 스타일 Java/Spring을 사용해 애플리케이션을 만들다보면 Controller-Service-Repository 패키지 안에서 영원히 헤매고 다니게 됨. 프로젝트에 익숙해지기 전에는 뭐가 어디에 있는지 알 수 없음. 그래서 한 가지 실험을 했음 * 집합의 포함관계를 강력히 의식한 계층형 구조로 패키지를 구성 * 한 가지 용도를 암시하는 클래스 이름으로 행위와 책임을 제한(SRP) * 서비스/컨트롤러를 만들 때 publi..

카테고리 없음 2022.11.30

Spring Scheduler 테스트 하기

Spring Scheduler Test Spring Scheduler 사용법은 매우 간단하다. SpringBoot는 스타터에 스케줄러를 내장하고 있기 때문에 별도의 의존성을 추가하지 않고도 사용할 수 있다. 초간단 Spring Scheduler 적용에서 스케줄러를 동작시키는 방법을 정리했는데, cron expression 말고도 fixedDelay 속성을 이용하면 지정한 주기로 스케줄러를 실행시킬 수 있다. @Scheduled(cron = "0 0,30 3 * * *") // 매일 3시, 0시 30분 fun publishReward() { log.info("START === PUBLISH::REWARD::EVENT::DAILY::SCHEDULER ${UUID.randomUUID()}") rewardSer..

Spring 2022.11.28

call by value

우연히 https://www.facebook.com/tobyilee/posts/10222585502760852 이 글을 읽고 지금까지 Call by reference와 Call by reference에 대해 잘못 알고 있었다는 사실을 알았다. 지금까지는 Java에서 call by value는 기본 타입 호출, call by reference는 그 외 모든 레퍼런스 타입을 호출할 때 사용한다고 알고 있었지만, 사실은 Java는 모두 call by value로 동작한다. call by reference에서 말하는 by reference와 Java에서 말하는 reference value는 다르다. Call by value가 뭔가? 함수가 호출되면 메모리에서 함수를 위한 임시 공간을 할당한다. Call by v..

Java 2022.09.14

Springboot 통합 테스트로 불안한 리팩토링에서 벗어나기

통합테스트를 작성한 경험을 기록했습니다. 아래와 같은 순서로 말해보겠습니다. 통합테스트 작성 계기 웹 레이어 테스트와 통합테스트 웹 레이어 테스트 작성 통합 테스트 작성 군말 통합 테스트 작성 계기 제가 참여하는 프로젝트는 구조를 크게 3계층으로 나눌 수 있습니다. 아주 흔한 구조입니다. Web Service Repository 저는 이중에서 서비스 레이어에 대한 단위 테스트만 집중해서 작성했습니다. (모든 레이어를 꼼꼼하게 테스트해야 한다고 생각하지만 내부적인 협의점이 그것이었습니다.) 라이브러리에 의존하는 단위 테스트를 하면서 가장 불편했던 점은 프로덕션 코드를 변경하면 테스트 코드를 함께 변경해야 한다는 것이었습니다. 간단한 예시를 들어보겠습니다. 불필요한 부분은 생략하겠습니다. //제품 코드 fu..

Spring 2022.08.24

Spy와 Mock의 차이. 그리고 Spy 사용

Mock과 Spy는 테스트 더블(대역)이다. Test Double은 테스트를 목적으로 프로덕션 오브젝트를 대체하는 오브젝트를 뜻한다. ‘Test Double’이라는 말 때문에 처음에는 잘 이해가 되지 않았는데 영어권에서는 스턴트 맨을 스턴트 더블이라고 한단다. 그러니까 테스트 더블은 말하자면 테스트를 목적으로 진짜 오브젝트를 대신하는 테스트 계 스턴트맨이라고 볼 수 있다. Mock Mock은 가짜 오브젝트다. ‘가짜 오브젝트’란 뭘까? 간단한 Post 클래스를 작성해서 예시를 들어본다. class Post( val id: Long? = null, val title: String, val content: String, ) { fun create(title: String, content: String) { ..

카테고리 없음 2022.07.31