-
주식 조회 서비스 성능 최적화
개요 AI 뉴스 기반 주식 추천 서비스(StockAI)에서 조회 속도 저하 문제를 분석하고, BE(Spring Boot) + FE(Next.js) 전체 스택에 걸쳐 13개 최적화 항목을 도출. 순차적 병목 → 병렬화, 2왕복 → 1왕복, 중복 요청 → 캐시 재사용 등의 원칙으로 접근. 1. 국내 주식 배치 가격 조회: 순차 → 병렬 Before StockPriceBatchService.processChunk() ├─ stockCode[0]: cache miss → KIS API → 125ms ├─ stockCode[1]: cache miss → KIS API → 125ms ├─ stockCode[2]: c... Read More
-
API 워터폴 제거로 전체조회 속도 개선하기
사전 개념 이 글에서 반복해서 등장하는 세 가지 개념을 먼저 정리한다. SSR (Server-Side Rendering): 서버에서 HTML을 완성해 브라우저에 보내는 방식. 클라이언트가 빈 화면을 보지 않고 곧바로 콘텐츠를 볼 수 있다. 단, 서버가 데이터를 가져와야 하므로 응답 자체가 느려질 수 있다. ISR (Incremental Static Regeneration): 정적 페이지를 빌드한 뒤 일정 시간(revalidate)이 지나면 백그라운드에서 다시 생성하는 방식. 매 요청마다 서버가 일할 필요 없으므로 응답이 빠르고, 캐시 만료 시에만 갱신된다. Delta 조회: 이미 가지고 있는 데이터... Read More
-
Harness, CLAUDE.md, AGENTS.md의 역할과 차이
들어가며 오늘은 Harness, CLAUDE.md, AGENTS.md가 각각 어떤 역할을 하는지 정리해봤다. 처음 이름만 보면 셋 다 작업을 더 효율적으로 도와주는 무언가처럼 느껴진다. 하지만 실제로는 다루는 대상도 다르고, 사용되는 맥락도 분명히 다르다. Harness는 소프트웨어를 안전하게 배포하기 위한 운영 플랫폼이다. CLAUDE.md는 AI에게 프로젝트 규칙을 알려주는 문서다. AGENTS.md는 AI의 역할 분담과 작업 흐름을 정의하는 문서다. 즉, Harness는 실제 서비스 전달 과정을 다루는 도구이고, CLAUDE.md와 AGENTS.md는 AI가 프로젝트 안에서 더 정확하고 ... Read More
-
Harness란
Harness Harness는 소프트웨어를 개발한 뒤 실제 운영 환경까지 안전하게 전달하기 위한 빌드, 테스트, 배포, 검증 과정을 자동화하고 관리하는 플랫폼이다. 단순히 코드를 작성하는 것에서 끝나는 것이 아니라, 그 코드가 어떤 흐름으로 배포되고 운영되는지까지 설계하는 개념에 가깝다. 즉, 개발과 운영 사이를 연결하는 DevOps 관점의 엔지니어링이라고 볼 수 있다. 예전에는 배포를 사람이 직접 서버에 접속해 명령어를 실행하거나, 순서를 기억해가며 수동으로 진행하는 경우가 많았다. 하지만 서비스 규모가 커질수록 이런 방식은 실수 가능성이 높고, 같은 작업을 반복할 때마다 품질이 달라질 수 있... Read More
-
Refresh Token 구현 방식 고도화
요약 기존: Random Hex String 방식 변경: JWT + Metadata JSON 방식 이전에는 특정 토큰을 찾기 위해 Redis를 순회해야 할 수 있어 조회 비용이 O(N)에 가까워질 수 있었습니다. 현재는 JWT 내부의 사용자 정보와 디바이스 정보를 활용해 O(1) 수준의 직접 조회가 가능해졌습니다. 성능뿐 아니라 운영 편의성과 보안 검증 수준도 함께 개선되었습니다. 버전별 상세 비교 항목 이전 버전 (Legacy) 현재 버전 (Modern) 비고 토큰 형태 ... Read More
-
Token stateless
문제 상황 JWT 기반 인증 시스템을 구현하면서 로그아웃 기능을 추가하려 했습니다. 하지만 JWT는 기본적으로 서버가 상태를 저장하지 않는 무상태(stateless) 구조이기 때문에, 사용자가 로그아웃을 하더라도 서버는 해당 토큰이 유효한지 아닌지를 판단할 수 없습니다. 처음에는 이 문제를 해결하기 위해 Redis를 도입해 사용자의 토큰을 저장하고, 블랙리스트 방식으로 로그아웃 시 해당 토큰을 무효화하려고 했습니다. 고민한 점 Redis에 토큰을 저장하면 로그아웃 처리를 쉽게 할 수 있고, 토큰 유효성 검사 시 블랙리스트에 있는지 체크하면 되므로 보안 측면에서 유리합니다. 하지만 이 방식은... Read More
-
JPQL
JPQL JPA는 SQL을 추상화한 JPQL이라는 개체 지향 쿼리 언어를 제공한다 테이블을 대상으로 쿼리 하는 것이 아닌 엔티티 객체를 대항으로 쿼리한다 JPQL은 SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는 장점이 있다 JPQL은 SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다 JPQL은 결국 SQL로 변환된다 JPQL 예제 // 예: Member 엔티티에서 이름이 '홍길동'인 멤버 조회 @Query("SELECT m FROM Member m WHERE m.name = :name") List<... Read More
-
AOP
AOP ( 관점 지향 프로그래밍 ) AOP는 OOP( Object Oriented Programming )를 돕는 보조적인 기술로, 관심사의 분리( 기능의 분리 )의 문제를 해결하기 위해 만들어진 프로그래밍 패러다임이다. AOP는 기능을 핵심 관심 사항( Core Concern )과 공통 관심 사항( Cross - Cutting Concern )으로 분리시키고 각각을 모듈화 하는것을 의미한다. AOP의 핵심 개념 관심사 ( Concern ) 애플리케이션에서 어떤 기능이나 책임을 말한다 예 : 비즈니스 로직, 보안, 로깅 등.. 횡단 관심사 ( Cr... Read More
-
Test Code
테스트 코드 소프트웨어 개발 후 기능과 동작을 테스트하는 데 사용되는 코드이다. 개발자가 예상한대로 프로그램이 실행하는지 확인하는 역할을 한다. 어떤 기능을 테스트할 것인지에 대해 각각 테스트 케이스를 분류하고, 다양한 라이브러리와 프레임워크를 이용해 작성할 수 있다. 테스트 코드의 종류 단위 테스트 ( Unit Test ) 하나의 메서드나 클래스 등 작은 단위를 독립적으로 테스트하는 방법이다. 외부 의존성( DB, 네트워크 등 )은 mock이 처리 예 : 회원가입 시 이메일 형식을 검사하는 함수만 따로 테스트 통합 테스트 ( Int... Read More
-
Filter
Filter Servlet Filter는 서블릿 스펙의 일부로, 웹 애플리케이션의 요정(Request) 또는 응답(Response)을 가로채고 가공할 수 있는 재사용 가능한 컴포넌트이다. Spring에서도 이를 활용해 인증/인가 필터, 로깅 필터, CORS 필터 등을 만들 수 있다. Filter 동작 순서 클라이언트의 요청이 먼저 필터를 통과함 각 필터는 doFilter() 메서드를 통해 요청을 가로채고 필요 시 후속 필터 또는 서블릿으로 넘김 서블릿/컨트롤러가 응답을 생성한 후 필터로 다시 돌아옴 필터가 응답을 후처리하고 클라이언트로 전달 [HTTP 요청] ↓ [FilterC... Read More
-
SOLID 원칙
SOLID 원칙 정리 SOLID는 객체지향 설계의 5가지 핵심 원칙을 의미하며, 유지보수성과 확장성을 고려한 유연한 소프트웨어 설계를 가능하게 한다. 이 원칙은 로버트 C. 마틴(Robert C. Martin, 일명 ‘Uncle Bob’)이 제안했다. 단일 책임 원칙 (Single Responsibility Principle, SRP) 하나의 클래스는 하나의 책임만 가져야 하며, 클래스는 오직 하나의 변경 이유만 가져야 한다. 클래스가 여러 책임을 가지면, 하나의 변경이 다른 기능에 예기치 않은 영향을 줄 수 있다. 이는 응집도가 낮고, 유지보수가 어려운 코드로 이어진다. // 책임이 뒤섞인 ... Read More
-
Json Web Token
Json Web Token 사용자 인증 및 권한 부여에 널리 사용되는 토큰 기반 인증 방식이다. 클라이언트와 서버 간에 정보를 안전하게 전달하기 위한 JSON 기반의 암호화된 토큰이다. JWT는 세 파트로 나누어지며, 각 파트는 점(.)으로 구분하여 표현한다. 1) Header ( 헤더 ) : 해시 암호화 알고리즘과 토큰의 타입으로 구성 { "alg": "HS256", "typ": "JWT" } alg: 서명에 사용할 알고리즘 (예: HMAC SHA256) typ: 토큰의 타입, 일반적으로 “JWT” 2) Payload ( 페이로드 ) : 내용, 즉 토큰에 담을 클레임(cla... Read More
-
Cookie, Session, Token
Cookie 사용자의 웹 브라우저에 저장되는 정보로 사용자의 상태 혹은 세션을 유지하거나 사용자 경험을 개선하기 위해 사용된다. 서버가 Set-Cookie 해더를 통해 브라우저에게 쿠키를 저장하게 하고, 이후 브라우저는 요청마다 쿠키를 Cookie헤더에 실어 보낸다. 간단하게 클라이언트에 저장되는 작은 데이터 파일이다. Cookie 특징 클라이언트에 저장되며, 보통 키 - 값 쌍으로 구성된다. 로그인 정보, 세션 ID 등 상태 유지를 위한 정보를 담는데 사용된다. 기본적으로는 보안에 취약하므로 HttpOnly,Secure,SameSite등의 옵션을 설정하여 보안을 강화한다. Cook... Read More
-
Validation, BindingResult
Validation(검증) 클라이언트에서 서버로 값을 전달하고자 할 때 (@RequestBody, @RequestParam, @PathVariable) 전달되는 데이터에 대해 유효성 검증을 수행하며 유효하지 않을 경우 에러 @PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) { // 유효성 검사 통과 시 실행됨 return ResponseEntity.ok("Created"); } Validation의 주요 기능 @Valid 또는 @Validated 어노테... Read More
-
Spring Bean, Singleton Pattern
Bean 이란? 빈( Bean )은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다 스프링 컨테이너? 스프링 컨테이너는 스프링 빈의 생명 주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 한다. IoC와 DI의 원리가 스프링 컨테이너에 적용된다. Bean 핵심 개념 용어 설명 Bean Spring 컨테이너가 생성하고 관리하는 객체 IoC (... Read More
-
객체지향 설계
객체지향 설계 과정 ( OOD - Object-Oriented Design ) 요구사항을 찾고 세분화 한다 무엇을 만들건지 정의 기능과 제약사항 도출 클래스 및 책임 도출 ( 도메인 모델링 ) 핵심 개념을 분석해서 클래스와 메서드로 변환 클래스는 실세계 개념을 반영 ( User,Schedule … ) 객체 관계 정의 객체 간 관계 설정 연관 ( Association ) 상속 ( Inheritance ) 집합 ( Aggregation ) 포함 ( Comp... Read More
-
Spring 데이터 흐름
Spring 자바 기반의 웹 애플리 케이션 개발을 위한 프레임 워크(오픈소스) 이다. 구분 내용 장점 - 경량 프레임워크로 유연한 모듈화 가능 - 의존성 주입(DI)으로 낮은 결합도 유지 - AOP로 공통 기능 분리 및 재사용성 향상 - Spring Boot 등 풍부한 생태계 지원 - 자동 설정, 내장 서버로 빠른 개발 가능 ... Read More
-
Quick sort, Merge sort, Heap sort
Quick sort ( 퀵 정렬 ) 이름 그대로 빠르게 정렬을 수행하는 알고리즘이다. 하나의 피벗(pivot)을 기준으로 두 개의 부분리스트로 나누어 하나는 피벗보다 작은 값들의 부분 리스트, 다른 하나는 피벗보다 큰 값들의 부분리스트로 정렬한 다음, 각 부분리스트에 대해 다시 위 처럼 재귀적으로 수행하는 정렬하는 방법이다. 비균등 분할 정렬이다 : 항상 데이터를 균등하게 나누지 않는다. 불안정 정렬이다 : 피벗을 기준으로 요소들을 교환(swap)하면서 정렬을 수행하는데, 이 과정에서 같은 값을 가진 원소들끼리도 위치가 바뀔수 있다. Quick 정렬 과정 피벗을 하나 선택한다 피벗을 기... Read More
-
Stack, binary search
STACK 스택은 쌓다,쌓아올리다와 같은 뜻을 가진 용어로, 쉽게 생각하면 접시를 높이 쌓아 놓은 형태라고 생각하면 된다. 즉, 데이터를 순서대로 쌓는 자료구조이다. Stack의 특징 후입선출 (LIFO) : 먼저 들어온 데이터가 나중에 빠져나가는 구조 단방향 입출력 구조 : 데이터의 들어오는 방향이나 나가는 방향이 같다. 데이터를 하나씩만 넣고 뺄수 있다. 깊이 우선 탐색(DFS)에 이용된다 Stack 선언 class StackEx { public static void main(String[] args) { // Integer형 스택 선언 St... Read More
-
시간복잡도와 공간복잡도
빅오 표기법( Big-O Notation ) 어떤 함수나 알고리즘이 입력 크기 n에 따라 얼마나 빠르게(또는 얼마나 많은 자원을) 증가하는지를 나타냅니다. 핵심은 “점근적 상한선”: 입력이 매우 커질 때, 가장 큰 항만 고려하여 효율성을 비교합니다. 빅오(O) : 최악의 경우 (가장 많이 사용) 빅Ω (오메가) : 최선의 경우 빅Θ (세타): 평균 혹은 정확한 경우 (상하한 모두 같을 때) 평균은 최상과 최악의 평균값으로 시간복잡도는 최악을 기준으로 “빅오 표기법”으로 판단하여 성능을 예측한다. why? 알고리즘 효율성을 상한선 기준으로 표기하기 때문이다. 알고리즘 효율성은 값이 클수... Read More
-
동기와 비동기
동기식 처리 ( Synchronous ) 동기식 처리 모델(Synchronous processing model)은 직렬적으로 태스크(task)를 수행한다. 순차적으로 실행되며 어떤 작업이 수행중이면 다음 작업은 대기한다. 동기식 처리 코드 public class Synchro { public static void main(String[] args) { method1(); method2(); method3(); } public static void method1() { System.out.println("method1"); } public static void me... Read More
-
Programmers [09]
정수 내림차순으로 배치하기 문제설명 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한조건 n은 1이상 8000000000 이하인 자연수입니다. 입출력 예 n return 118372 873211 주어진 솔루션 class Solution { public long solution(long n) { long answer = 0; ... Read More
-
Thread
Thread 프로그램 내에서 독립적으로 실행되는 하나의 작업 단위이다. 싱글 쓰레드는 한번에 하나의 작업만 처리하지만, 멀티 쓰레드는 여러 작업을 동시에 처리 할 수 있다. 멀티 쓰레드를 활용하면 여러 작업을 병렬로 수행할 수 있어 처리 성능을 향상시킬 수 있다. 싱글 쓰레드 (Single Thread) 한 명의 일꾼이 작업을 처리하는 것과 같다. 한명의 일꾼이기 때문에 여러 개의 작업이 있다면 순차적으로 처리한다. main() 메서드는 프로그램 시작과 동시에 생성되는 하나의 쓰레드이다. 싱글 쓰레드 예제 System.out.println("::: main 쓰레드 시... Read More
-
Stream
Stream 데이터를 효율적으로 처리할 수 있는 흐름 선언형 스타일로 가독성이 뛰어나다 데이터 준비 -> 중간 연산 -> 최종 연산 순으로 처리된다 stream의 특징 원본 데이터 소스를 변경하지 않는다 : 읽기만 한다. 일회용이다 : 한번 사용하면 닫혀서 재사용이 불가능하다. 최종 연산 전까지 중간 연산을 수행하지 않는다. 작업을 내부 반복으로 처리한다: forEach()는 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다. for문과 stream 비교하기 // for 명령형 스타일 : 각 요소 * 10 List<Integer>... Read More
-
Lambda
익명 클래스 익명 클래스는 이름이 없는 클래스를 익명 클래스하고 한다. 별도의 클래스 파일을 만들지 않고 코드 내에서 일회성으로 정의해 사용하기 때문에 이름이 없다. 인터페이스, 클래스의 구현과 상속을 활용해 익명 클래스를 구현할수 있다 -> 람다에서는 인터페이스를 사용한 익명 클래스가 활용된다. 인터페이스를 활용한 익명 클레스 예제 // Calculator class @FunctionalInterface // 함수형 인터페이스 설정 public interface Calculator { int sum(int a, int b); } // 인터페이스를 활용한 익명클래스 만들기 ... Read More
-
Generic
Generic 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미 제네릭을 활용하면 코드 재사용성과 타입 안정성을 보장받을 수 있다. 사용방법 List< 타입 매개변수 > -> List stringList = new ArrayList(); 주의사항! 제네릭 타입 자체로 타입을 지정하여 객체를 생성하는 것은 불가능 한다. 즉, new 연산자 뒤에 제네릭 타입 파라미터가 올수는 없다. static 변수의 데이터 타입으로 제네릭 타입 파라미터가 올수는 없다. Generic 예제 // Main Class // 1. 재사용성 보장 (타입 소거 :... Read More
-
Collection
Collection 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것을 말한다. 이러한 Collection은 자바의 인터페이스를 사용하여 구현한다. array(배열)가 있는데 왜 굳이 collection을 쓸까? 배열은 정적 메모리이고, collection은 동적 메모리이기 때문이다. 배열은 할당 받은 공간이 정해지면 변경이 불가능하지만, collection은 공간이 필요한 만큼 추가가 가능하다. Collection의 종류 ... Read More
-
Optional
Optional null을 안전하게 다루게 해주는 객체이다. -> null : 프로그램에서 값이 없음 또는 참조하지 않음을 나타내는 키워드 null을 직접 다루는 대신 Optional을 사용하면 NullPointerException을 방지할 수 있다. NPE(NullPointerException) 개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 NPE(NullPointerException)이다. NPE를 피하려면 null 여부를 검사해야 하는데, null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭다. 그래서 null 대신 초기값을 ... Read More
-
예외처리 ( Exception )
예외처리 예상치 못한 상황이 발생하는 경우 의도하지 않은 예외 // 의도하지 않은 예외 int ret = 10/0; System.out.println("ret = " + ret); System.out.println("프로그램 종료"); // 결과값 // Exception in thread "main" java.lang.ArithmeticException: / by zero // at chapter3.exception.Main.main(Main.java:8) // Process finished with e... Read More
-
클래스 하나만으로 계산기 만들기
계산기 만들기 객체지향에 대해 배웠으니 스탭별 계산기를 만들어보자. 계산기 클래스 하나로 계산기를 만들어 보자 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 초기값 설정 int sum = 0; boolean check = true; while (check) { System.out.println("첫번째 양의 정수를 입력해주세요... Read More
-
객체지향 이해하기 - 3
추상클래스 ( abstract ) 공통 기능을 제공하면서 하위 클래스에 특정 메서드를 구현을 강제하기 위해 사용한다. 추상 클래스는 인스턴스화 할 수 없다. 추상 클래스와 인터페이스의 차이점 계층적 구조를 표현하면서 공통 속성과 기능을 재사용할때 추상 클래스를 사용하는것이 적합하다. 추상화와 다형성 추상화 : 특정 계층에서 불필요한 정보를 제거하고 본질적인 특징만 남기는것 다형성 : 하나의 타입으로 여러 객체를 다룰 수 있는 특징 형변환 부모타입으로 자식타입을 다룰 수 있는 이유는 자동으로 형변환(Config)이 발생했기 때문이다. [ 부모 -> 자식 ] : 업케스팅... Read More
-
객체지향 이해하기 - 2
캡슐화 ( Encapsulation ) 외부에서 직접 접근하지 못하게 보호하는 개념 ( why? 정보은닉 ) 접근제어자를 통해야만 변경이 가능하다. -> 접근제어자 : 클래스, 변수, 매서드, 생성자의 접근 범위를 제한하는 키워드이다. 접근제어자 종류 접근 제어자 클래스 내부 패키지 내부 상속한 클래스 전체공개 public O O O O protected O O O X ... Read More
-
객체지향 이해하기 - 1
Static 모든 객체가 같은 값을 공유한다. static 변수와 메서드는 한번만 생성되고 Method Area에 저장된다. 인스턴스 맴버 (인스턴스 변수 + 인스턴스 메서드 ) 객체를 만들때마다 생성되는 변수와 메서드이다. 각 객체가 개별적으로 값을 가진다 ( 공유 X ) 인스턴스는 Heap 영역에 위치한다. 인스턴스 변수 객체가 생성될 때마다 따로 만들어지는 변수 ( 객체를 생성한 후 접근할 수 있다. ) 클래스 변수 클래스가 로드될때 한번만 생성 모든 객체가 공유하는 변수이다. Heap이 아니라 Mthod Area에 저장된다. ( 객체를 만들지 않아도 “클... Read More
-
Github 기본 명령어
Github와 친해지기 기본적인 문법 git branch login : commit이 있어야 가능 git branch -m main : 현재 브랜치의 이름을 main으로 변경하라 git branch : 현재 .git 폴더 안의 branch 확인 git switch login “브랜치 이름” = git checkout login “브랜치 이름” : 브랜치 위치 이동 git switch -c “브랜치 이름” = git checkout -b “브랜치 이름” : 브랜치 한번에 생성 & 이동 git merge “브랜치 이름” : “브랜치 이름”에서 작업한걸 main에 합친다 git branch “... Read More
-
Programmers [08]
프로그래머스 문제풀이 K번째 수 문제 설명 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다. 예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면 array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다. 2에서 나온 배열의 3번째 숫자는 5입니다. 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했... Read More
-
Programmers [07]
프로그래머스 문제풀이 하샤드 수 문제 설명 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. 입출력 예 x return 10 true 12 true 11 false 13 fals... Read More
-
SQL 기본기 다지기
SQL 구문 배우기 SQL 기본 틀 select * <- 전체 조회 from table_테이블 이름 where 조건 group by (뭘로 그룹지을건지) order by (데이터를 출력하거나 정렬하기) 1) 문자 변경 REPLACE : 지정한 문자를 다른 문자로 변경 SUBSTRING : 특정 문자만 추출 CONCAT : 여러 문자를 합하여 포멧팅 2) 조건문 IF : if(조건, 조건을 충족할때, 조건을 충족하지 못할때) - CASE WHEN END : case when 조건1 then 값(수식)1 when 조건2 then 값(수식)2 els... Read More
-
DB연동
Firebase Database 시작하기 기본 세팅 구성 <script type="module"> // 타입 변경 해주기 // Firebase SDK 라이브러리 가져오기 import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js"; import { getFirestore } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js"; import { collection, addDoc } from "https://www.gstati... Read More
-
HTML 기본기 다지기
구글 폰트 가져오기 먼저 구글 폰트를 검색한 후에 마음에 드는 폰트를 골라 import를 가져온다. <style> @import url('https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Gowun+Dodum&display=swap'); * { // 여기서 *은 밑에 있는 모든 코드들에게 적용한다. font-family: "Gowun Dodum", sans-serif; } </style> 이런식으로 html에 폰트를 적용할 수 있다. 부트스트랩 다음은 다양한 사람... Read More
-
Programmers [06]
프로그래머스 문제풀이 예산 문제 설명 문제 설명 S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다. 물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다. 부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때... Read More
-
Programmers [05]
프로그래머스 문제풀이 숫자 문자열과 영단어 문제설명 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다. 1478 → “one4seveneight” 234567 → “23four5six7” 10203 → “1zerotwozero3” 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.... Read More
-
Programmers [04]
프로그래머스 문제풀이 덧칠하기 문제설명 어느 학교에 페인트가 칠해진 길이가 n미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다. 넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 n개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 n번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했... Read More
-
Programmers [03]
프로그래머스 문제풀이 [PCCE 병과분류] 문제설명 퓨쳐종합병원에서는 접수한 환자가 진료받을 병과에 따라 자동으로 환자 코드를 부여해 주는 프로그램이 있습니다. 환자 코드의 마지막 네 글자를 보면 환자가 어디 병과에서 진료를 받아야 할지 알 수 있습니다. 예를 들어 환자의 코드가 “_eye”로 끝난다면 안과를, “head”로 끝난다면 신경외과 진료를 보게 됩니다. 환자 코드의 마지막 글자에 따른 병과 분류 기준은 다음과 같습니다. 마지막 글자 병과 “_eye” Ophthalmology “h... Read More
-
Programmers [02]
프로그래머스 문제풀이 콜라 문제 문제 설명 오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다. 정답은 아무에게도 말하지 마세요. 콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가? 단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다. 문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 ... Read More
-
Programmers [01]
프로그래머스 문제풀이 뒤에 있는 큰 수 찾기 문제 설명 정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다. 정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다. 입출력 예 numbers result [2, 3, 3, 5] [3, 5, 5, -1] ... Read More
