분류 전체보기 53

[CS] Database 정리 (3)

📍레디스(Redis)Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictionary(key-value) 구조 데이터 관리 Server 시스템이다.여기서 key-value 구조 데이터란, mysql 같은 관계형 데이터가 아닌 비 관계형 구조로서 데이터를 그저 '키-값' 형태로 단순하게 저장하는 구조를 말한다.그래서 관계형 데이터베이스와 같이 쿼리 연산을 지원하지 않지만, 대신 데이터의 고속 읽기와 쓰기에 최적화 되어 있다.그래서 Redis는 일종의 NoSQL 로 분류되기도 한다. 또한 Redis는 인 메모리(In-Memory) 솔루션으로도 분류되기도 하는데, 다양한 데이터 구조체를 지원함으 로써 DB, Cache, Message Queue, Shared Memo..

카테고리 없음 2025.08.13

[CS] Database 정리 (2)

📍정규화가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다.중복된 데이터를 만들지 않으면, 무결성을 유지할 수 있고, DB 저장 용량 또한 효율적으로 관리할 수 있다. 목적데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.무결성을 지키고, 이상 현상을 방지한다.테이블 구성을 논리적이고 직관적으로 할 수 있다.데이터베이스 구조를 확장에 용이해진다.정규화에는 여러가지 단계가 있지만, 대체적으로 1~3단계 정규화까지의 과정을 거친다. 제 1정규화(1NF)테이블 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것을 말한다.만족해야 할 조건은 아래와 같다.어떤 릴레이션에 속한 모든 도메인이 원자값만으로 되어 있어야한다.모든 속성에 반복되는 그룹이 나타나지 않는다.기본키를 사용하여 관련 ..

CS 2025.08.02

[CS] Database 정리 (1)

📍 KEY 종류Super key(슈퍼키) : 유일성 O, 최소성 XCandidate key(대리키) : 유일성 O, 최소성 O (키의 집합에서 하나라도 삭제하면 유일성 만족하지 못하는 성질)Primary key(기본키) : 후보 키 중에서 선정된 키. 유일성 0, 최소성 O/ Null값 가질수 없다Alternate Key(대체키) : 후보 키에서 기본키를 뺀 모든 후보 키Foreign Key(외래키) : 다른 테이블의 Primary key를 참조하는 컬럼 📍 JOIN 종류 INNER JOIN교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여줌. LEFT OUTER JOIN왼쪽테이블 기준으로 JOIN RIGHT OUTER JOIN 오른쪽 테이블 기준으로 JOIN FULL OUTER JOIN합..

CS 2025.08.01

[Spring Boot] Spring Batch의 실행 흐름을 내부 메타 테이블로 추적해보기

📍 개요Spring Batch를 도입하고 스키마를 보면 아래와 같이 다양한 table이 추가로 생성되어 있는 것을 볼 수 있다.자동으로 생성되는 이 9개의 테이블은 각각 언제 생성되고 하는 역할이 무엇일까? 📍 왜 생길까?이 테이블들은 Spring Batch의 핵심 기능인 “이력 관리, 실행 추적”을 위한 저장소다.Batch는 단순히 데이터를 처리하는 데서 그치지 않고,언제 실행됐는지어떤 Job 파라미터로 실행됐는지성공했는지 실패했는지실패했으면 왜 실패했는지를 모두 DB에 기록하고 관리한다.이 역할을 하는 것이 바로 위의 9개 테이블인 것. 📍 언제 생성되는 걸까?스프링 부트에서는 보통 아래 설정을 통해 이 테이블들을 자동으로 생성할 수 있다.spring: batch: jdbc: ..

springboot 2025.07.28

[Spring Boot] CSV 기반 공공데이터 적재 자동화: 성능과 정확성을 모두 잡는 방법

📍 개요공공데이터를 활용한 데이터 적재 파이프라인을 구축하는 초기 단계에서는 비교적 단순한 구조로 시스템을 설계했다.CSV 파일은 공공기관에서 주기적으로 제공되었고, 수집된 파일은 Python(Pandas)을 활용해 구조 정제, 이상값 보정 등 전처리 과정을 거쳤다.또한, placeId를 기준으로 Google Maps API 및 S3를 활용해 관련 이미지도 함께 수집·저장하는 구조였다.전처리된 데이터는 Spring Boot 기반의 애플리케이션에서 수동 또는 반자동으로 데이터베이스에 적재되었다.하지만 기존 로직은 새로운 CSV 파일이 들어올 때마다 전체 데이터를 다시 적재하는 방식이었기 때문에, 이미 존재하는 데이터도 중복 저장되는 문제가 발생했다.공공데이터는 자주 갱신되며, 제공되는 CSV 파일 역시 ..

springboot 2025.07.26

[Java] 스트림 API - 기본

📍 스트림 API 시작스트림이란 데이터들이 흘러가면서 필터되고, 매핑된다. 그래서 마치 데이터가 물 흐 르듯이 흘러간다는 느낌을 받았을 것이다.참고로 흐르는 좁은 시냇물을 영어로 스트림이라 한다.import java.util.List;public class StreamStartMain { public static void main(String[] args) { List names = List.of("Apple", "Banana", "Berry", "Tomato"); // 스트림을 이용한 필터링 + 대문자 변환 + 수집 List result = names.stream() .filter(name -> name.startsWith("B")..

java 2025.06.02

[Java] 람다 VS 익명 클래스

📍람다를 쓸까 익명 클래스를 쓸까?1. 문법의 차이자바에서 익명 클래스와 람다 표현식은 모두 간단하게 기능을 구현하거나, 일회성으로 사용할 객체를 만들 때 유용하지 만, 그 사용 방식과 의도에는 차이가 있다. // 익명 클래스 사용 예Button button = new Button(); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {System.out.println("버튼 클릭"); }});익명 클래스는 클래스 선언하자마자 인스턴스를 생성하는 방법이다. 즉 하나의 클래스다. // 람다 표현식 사용 예Button button = new Button();button.s..

java 2025.05.12

[Java] 함수형 인터페이스

📍람다를 쓰기 위해 인터페이스를 만들자?자바에서 람다를 사용하기 위해선 반드시 함수형 인터페이스가 필요하다.가장 기본적인 사용 형태를 아래 예제에서 볼 수 있다.public class GenericMain1 { public static void main(String[] args) { StringFunction upperCase = s -> s.toUpperCase(); String result1 = upperCase.apply("hello"); System.out.println("result1 = " + result1); NumberFunction square = n -> n * n; Integer result2 = square.app..

java 2025.04.11