본문 바로가기

전체 글

(88)
스프링부트 생성자주입, 세터주입을 통한 RESTful 웹서버 만들기 생성자 주입은 외부에서 생성자를 통해 의존성을 주입하는 방식으로, 객체가 생성될 때 생성자를 통해 필드를 초기화한다 초기화된 필드는 게터를 통해 속성값을 읽을 수 있고 반면에, 세터 주입은 세터 메서드를 통해 객체가 생성된 후 의존성을 수정하는 방식이다 1. Car 클래스는 @Entity 어노테이션을 사용하여 JPA 엔티티로 정의되어 있으며, 이 클래스는 데이터베이스의 테이블에 매핑, 클래스 생성자 필드들은 데이터베이스 열(columns)에 대응되어 JPA가 자동으로 관리 1-1.외부 클래스인 Owner 객체는 생성자 주입(Constructor Injection)을 통해 Car 객체에 주입, 이렇게 주입된 Owner는 @ManyToOne 어노테이션을 사용하여 다대일(N:1) 관계로 매핑되며, 외래 키는 ..
인터페이스분리원칙, 가짜 의존성 주입, 단위테스트 https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4_%EB%B6%84%EB%A6%AC_%EC%9B%90%EC%B9%99 인터페이스 분리 원칙 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.[1] 인터페이스 분리 원칙은 큰 덩어리의 인터페이스ko.wikipedia.org  1. 인터페이스 분리원칙에 의해 url 연결 성공, 실패 메서드를 분리한다 Web.js // 성공const processFetchContent = (text) => { const included = text.includes("메리크..
awk 입력받은 글자들을 컬럼으로 출력하기 1. applebananacherrydateelderberryfiggrape input.txt파일 = 가장 길이가 긴 문자인 elderberry를 기준으로 열의 너비를 계산해 설정된다.  2. ncol = int(60 / max + 0.5)# elderberry 글자수는 10, max=10에 넣어지고 정수로 계산하면 6 이된다    3. # 출력형식 정의 - max = 10일 때, fmt는 %-10.10s로 설정됩# 이는 출력 시 최소 10칸의 공간을 확보하며, 문자열이 10자를 초과해도 10자까지만 출력fmt = sprintf("%%-%d.%ds", max, max) # 현재줄의 길이 length($0)가 max보다 길면 긴길이만큼 max가 업데이트된다{ lines[NR] = $0 if (length..
장고와 레디스 루아스크립트로 선착순쿠폰 만들기 1. 장고 스레드로 선착순쿠폰을 만들려고했는데 동시성 문제로 인해 레디스 루아스크립트를 채택하였다 레디스는 싱글스레드라 루아스크립트로 작성하면 atomic하게 처리한다 이를 통해 동시에 발생하는 여러 요청에서도 쿠폰 발급이 정확하게 처리되도록 보장할 수 있다 SADD -> coupon_id 중복을 방지한다(coupon_id는 uuid로 하였다) SCARD -> 쿠폰 수를 반환해 인자로 받아올 쿠폰 개수를 3개로 제한한다.  generate_coupon_script = redis_client.register_script("""local generated_coupons_key = KEYS[1]local coupon_id = ARGV[1]local limit = tonumber(ARGV[2])local ttl..
레디스(redis)와 익스프레스(express js)로 프로모션쿠폰 API생성 레디스는 키-값 형식이어서 객체로 저장후 => json.stringify() 메서드를 사용해 json데이터로 직렬화시켜준다. app.post("/couponOn", async (req, res) => { try { // 본문에 post요청할때 const { discountAmount, ttl } = req.body; if (!discountAmount || discountAmount 할인금액을 연산시켜주려면 parse() 메서드를 사용해 json데이터를 다시 객체로 역직렬화 해준다. if (couponData) { const origin = 70000 // 직렬화한 json 데이터를 다시 parse메서드로 역직렬화후 객체로 만들어서 할인된금액으로 연산 co..
날씨 openapi (React Query,Suspense,Typescript 적용) 1. API키 발급  https://openweathermap.org/ Current weather and forecast - OpenWeatherMapOpenWeather Weather forecasts, nowcasts and history in a fast and elegant wayopenweathermap.org  2. 배열타입을 지정한다 type SeoulWeatherType = { weather:Array}   3. fetch함수로 api통신, 이때 json()타입이 any타입이므로 SeoulWeatherType으로 타입어선셜(타입을 정확히 알려줌)  const fetchWeather = async() =>{ const res = await fetch(`https://api.ope..
리액트 recoil로 상태관리 투두리스트의 추가,삭제,완료(밑줄긋기)의 상태를 업데이트하기 위해 useState대신 recoil로 대체했다 1. atom의 id들을 관리하기 위해 배열로 만들었다.export const idsAtom = atom({ key:'idsAtom', default:[] }) 2. atomFamily군으로 atom을 효율적으로 관리하기위해 idsAtom의 id들로 분할export const todoAtom = atomFamily({ key:'todoAtom', default:null }) 3. selector의 get은 atom의 배열로 만든 id 값을 가져와서 새로운 상태값을 계산한다.export const todoListSelector = selector({ key:'todoListSelector', get..
Bun js CRUD 테스트 get()을 사용해 쿼리를 실행하고 한개의 객체 결과를 {} 가져온다. 여기서는 id 한개를 가져온다findTask(id:number) { const SelectOne = this.db.query("SELECT * FROM tasks WHERE id =?") return SelectOne.get(id) }   all()은 쿼리를 실행하고  객체배열로 반환한다 [{},{},{},{},{}] 즉 모든 객체들을 반환! findTasks() { const selectMany = this.db.query("SELECT * FROM tasks") return selectMany.all() }   나머지 CREATE,UPDATE,DELETE는 run()을 ..