목록Server (32)
새발블로그
1. LIMIT / OFFSETMySQLLIMIT 5 OFFSET 10OracleOFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;2. 날짜 포맷 (DATE_FORMAT → TO_CHAR)MySQLDATE_FORMAT(dt, '%Y-%m') OracleTO_CHAR(dt, 'YYYY-MM') 3. 날짜 필터링OracleWHERE created_at >= DATE '2022-10-01' AND created_at MySQL DATE(created_at) 같은 함수 감싸기는 금지4. LEFT / RIGHT → SUBSTROracleSUBSTR(str, 1, 3) -- MySQL : LEFT SUBSTR(str, -3) -- MySQL : RIGHT5. CONCAT → ||Oraclefirs..
1. 문제 상황처음에 MyBatis에서 단일 Enum만 매핑할 때는 크게 문제가 없었는데,프로젝트가 커지고 Gender, OAuth2Provider, ProductType, RiskLevel 등 여러 개의 Enum을 DB 컬럼과 연결하다 보니 문제가 생겼다.MyBatis 기본 동작: Enum.name() / Enum.ordinal()로 자동 매핑 가능문제: Enum이 여러 개일 경우, 어떤 Enum 클래스인지 정확히 구분하지 못해서 ClassCastException 같은 에러 발생해결책: TypeHandler를 Enum마다 따로 구현해 주기2. 해결책: BaseTypeHandler 상속받아 구현예를 들어 ProductType 이라는 Enum을 DB의 VARCHAR 컬럼(product_type)과 매핑하려..
1. 서론Banklab에서 Spring Batch와 Scheduler를 붙이면서 정말 많은 삽질을 했다.ㅠㅠ당시에 하루면 끝날 줄 알았는데 ...3일은 걸렸었던 거 같다.그냥 레퍼런스대로 하면될 줄 알았는데 아예 모르는 상태로 하니까 어려워서 하루는 거의 공부하는 데 쓴 거 같다 Spring Batch는 금융 API 데이터를 주기적으로 수집·적재하는 데 필수였고, 스케줄러는 그 배치를 매일 새벽에 돌리는 역할을 맡았다.나중에 upsert로 변경하였지만 초기에는 delete + insert 구조여서 다음과 같이 설계하고 시작하였다 환경: Spring Framework 5.3.37Batch 버전: 4.3.9 (5.x 시도했다가 호환성 문제로 실패 → 결국 4.x 선택) 이 글은 내가 겪은 버전 지옥, Job..
1. WebSocket이란?기존 HTTP 통신의 한계를 보완하기 위한 양방향 통신 프로토콜항목설명비연결성(Connectionless)요청/응답 후 연결 종료무상태성(Stateless)서버는 클라이언트 상태를 기억하지 않음단방향 통신클라이언트가 요청해야 응답 가능 → 실시간성 부족-> 이런 단점을 보완하는 게 바로 WebSocket2. WebSocket 특징특징설명양방향 통신서버 ↔ 클라이언트 실시간 메시지 교환소켓 유지한번 연결되면 TCP 소켓이 계속 유지됨포트 공유HTTP와 동일한 80/443 포트 사용 (ws://, wss://)업그레이드 방식최초 연결은 HTTP → Upgrade: websocket 헤더로 전환3. STOMP 통신 구조 (Pub/Sub 모델)STOMP: WebSocket 위에서 동작..
1. AOP란?AOP (관점 지향 프로그래밍)은 공통적인 관심사(로깅, 예외 처리, 보안 등)를 핵심 비즈니스 로직과 분리하는 기법입니다.이를 통해 코드의 재사용성, 유지보수성, 가독성을 크게 높일 수 있습니다.대표적인 공통 관심사로그 출력메서드 실행 시간 측정예외 처리트랜잭션 관리인증/권한 체크2. AOP 핵심 용어용어설명Target핵심 비즈니스 로직이 담긴 객체 (ex. Service 클래스)Advice삽입할 코드 (로그, 권한 체크 등)JoinPointAOP가 적용될 수 있는 지점 (메서드 실행 등)PointcutAdvice를 적용할 JoinPoint를 지정하는 조건ProxyTarget을 감싸는 래퍼 객체. Proxy가 Advice 실행 후 Target 호출3. Advice 종류어노테이션설명어노테이..
1. 직렬화/역직렬화란?직렬화(Serialization): Java 객체 → JSON 문자열 변환역직렬화(Deserialization): JSON 문자열 → Java 객체 변환REST API 개발에서:응답(Response) 은 직렬화요청(Request) 은 역직렬화2. Jackson이란?Java 객체 ↔ JSON 변환을 담당하는 라이브러리Spring MVC에서 JSON 응답을 만들 때 MappingJackson2HttpMessageConverter를 통해 자동 적용단, Spring Legacy에서는 직접 설정을 해줘야 동작3. Spring Legacy에서 Jackson 설정하기3-1. Maven 의존성 추가 com.fasterxml.jackson.core jackson-databind 2.15.2 ..
1. 기본 파일 업로드 구조Spring에서는 MultipartFile을 사용해 업로드된 파일을 처리합니다.HTML form 태그에서 반드시 enctype="multipart/form-data"를 지정해야 합니다. Upload@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) throws IOException { if (!file.isEmpty()) { String originalName = file.getOriginalFilename(); file.transferTo(new File("/upload/dir/" + originalName)); } ret..
0. ORM(Object Relational Mapping)이란?ORM은 객체(Object)와 데이터베이스(Relational DB)를 매핑(Mapping)하는 기술개발자가 SQL을 직접 작성하지 않고, 객체 지향적으로 DB를 다룸ORM 프레임워크가 내부적으로 SQL을 생성해 실행대표 ORM: Hibernate, JPA장점SQL 작성량 줄어듦객체 지향적 개발 가능단점복잡한 SQL/성능 튜닝 시 제약 많음자동 생성된 SQL 디버깅 어려움1. MyBatis란?MyBatis는 SQL 기반의 ORM 프레임워크SQL을 직접 작성 → MyBatis가 SQL ↔ Java 객체 매핑복잡한 쿼리나 성능 튜닝이 필요한 경우 JPA보다 유리XML 또는 어노테이션을 이용해 매핑2. Mapper란?Mapper는 Java 코드와..