[Spring Boot] 조회와 수정의 분리(같이 했을 때 문제점과 리팩토링)
·
Java
공동구매 마감 로직 리팩토링 및 성능 개선기 개발을 하다 보면 종종 "돌아가니까 괜찮겠지?" 하고 넘어갔던 코드가 나중에 스노우볼이 되어 돌아오는 경험을 하게 됩니다.이번 프로젝트에서 '공동구매 목록 조회' 기능을 구현하며 겪었던 "조회 로직 내의 상태 변경"이라는 안티 패턴과,이를 스케줄러(Scheduler)를 통한 백그라운드 처리로 리팩토링하여 아키텍처를 개선한 과정을 공유하고자 합니다. 1. 문제 발생: "존재하지 않는 채팅방입니다"사용자의 동네를 기반으로 진행 중인 공동구매 목록을 보여주는 getGroupBuyings API를 개발하고 있었습니다. 이때 각 공구의 마감 시간(deadline)을 계산해 D-Day를 반환해야 했는데, 만약 조회 시점에 마감 시간이 지났다면 해당 공구의 상태를 CLOS..
[JDBC] JDBC의 배경 / JDBC 인터페이스와 메서드 / 동작원리
·
Java
JDBCJava 프로그램에서 DB 서버를 접속하여 데이터를 처리하는 기능을 구현하고자 할 때 사용되는 Java 기술 구성: JDBC API / JDBC Driver JDBC Driver특징: DB 서버마다 달라짐구성: 대부분 인터페이스로 구성 (DB마다 다르게 구현해야 하기 때문)배경: 여러 DB 서버에 알맞게 구현해줘야 하는데, 이 일을 개발자가 직접 하기 어려움해결 방안: 드라이버가 대신해 줌 → 자식 클래스를 만들어 객체를 대신 생성하여 사용할 팩토리 메서드가 모두 정의되어 있음결론: API로 구성된 JAVA와 달리, JDBC는 드라이버가 꼭 필요함사용법 및 주의사항:API에서 제공되는 메서드 호출예외처리 필수! → SQLException (try-catch 또는 throws)커넥션 반환 필수: 수..
[Java] JVM 메모리 구조로 보는 자바의 본질 / 객체지향의 특성별 예시
·
Java
자바를 공부하다 보면 수많은 문법과 규칙들을 마주하게 됩니다.처음에는 단순히 개념을 암기하기 바쁘지만, 그 안의 배경과 필요성을 들여다보면 이유 없는 규칙은 하나도 없다는 것을 깨닫게 됩니다.특히 개발자로서 견고하고 효율적인 코드를 설계하기 위해서는 암기식 문법이 아닌 '본질'을 이해해야 합니다.오늘은 자바가 어떻게 동작하는지 그 근본적인 원리부터 시작해, 객체지향의 4가지 특성이 가지는 진짜 의미를 정리해 보려 합니다. 자바는 왜 '컴파일+인터프리터' 언어일까? 그리고 혁신적인 JVM 메모리 구조 자바의 가장 큰 특징 중 하나는 컴파일과 인터프리터 방식을 혼합하여 사용한다는 점입니다.우리가 작성한 소스 코드(.java)는 먼저 컴파일러에 의해 바이트 코드(.class)로 변환됩니다.이 바이트 코드를 ..
[Java] 배열 / 2차원 배열 / 가변 배열
·
Java
배열생성만 할 때: new 데이터타입[크기]생성 시 기본값으로 구성(int = 0, boolean = false, …)ex) new int[10], new boolean[24]생성과 초기화를 동시에 할 때: new 데이터타입[ ] {요소1, 요소2, …}{요소1, 요소2, …}만 대입하는 것도 가능!변수 선언: 데이터타입[ ] 변수명, 데이터타입 변수명[ ]배열 변수는 데이터타입과 상관없이 4byte생성 과정 배열 객체 생성배열 변수 선언 후 객체 대입배열 요소에 기본값 주입 ( 요소 선언하지 않았을 때) for each문→ 배열, 컬렉션 구조일 때 사용읽기 전용(값에 의한 호출이기 때문에 값의 수정은 불가함) 2차원 배열선언 방법타입[ ][ ] 변수 이름;타입 변수 이름[ ][ ];타입[ ] 변수 이름..
[Java] println(char[ ] 배열명)에서 주소 값이 아닌 텍스트가 나오는 이유
·
Java
자바의 실제 JDK 소스 코드(내부 구현체)를 비교해 보면, 다른 함수들과 char[] 함수 사이에 중요한 차이가 딱 하나 있습니다.바로 String.valueOf()의 유무입니다. 요약- 다른 객체나 배열들은 String.valueOf()->toString()이 호출되며 주소값으로 변환함.- char[ ]은 전용 메서드를 통해 그 함정을 우회하여 I/O 스트림에 배열 자체로 전달되어 문자열처럼 변환되어 출력될 수 있음. 다른 배열(예: int[ ], double[ ])이 들어올 때println(int[]) 전용 메서드는 없기 때문에 가장 포괄적인 println(Object x)를 호출함.public void println(Object x) { String s = String.valueO..
[Java] 자바의 원칙 vs 편의성: 철학을 깬 복합 대입 연산자, char 배열 출력과 철학을 지킨 for-each문
·
Java
자바(Java)는 프로그래밍 언어 중에서도 상당히 보수적이고 원칙을 중시하는 언어지만,가끔 원칙보다 편의성을 선택한 문법을 발견했다.편의성을 선택한 계기가 그 기능의 목적과 유사하다는 점이 흥미로웠다. 왜 문법이 이렇게 정해졌는지 알 수 있기 때문이다. 자바의 개발 철학 1. 강력한 타입 안전성: "런타임 에러보다 컴파일 에러가 낫다"자바는 개발자가 실수할 여지를 컴파일 단계(코드를 작성하고 빌드하는 시점)에서 최대한 차단함.변수의 타입을 엄격하게 맞추고, 에러가 날 것 같은 코드는 컴파일러가 빨간 줄을 그어줌.(예: 강제 형변환, 예외 처리 등) 2. 하위 호환성: "과거의 코드를 버리지 않는다"자바는 10년, 20년 전에 짠 코드도 최신 자바 버전에서 무리 없이 돌아가도록 하는 것이 극도로 중요함...
[Java] while문 / 분기 처리-break, continue
·
Java
while문: 선 조건 확인 후 실행 반복문 -> 조건이 참일 때만 반복함형식: while(조건식) { 반복코드 }조건식: boolean타입무한 루프는 주로 break문과 함께 사용해 빠져나오는 조건을 적용함 분기(break, continue)break: 스위치문, 반복문에서만 사용 가능함continue: 반복문에서만 사용 가능함중첩된 반복문에서 한번에 빠져나가는 경우: 라벨로 빠져나갈 반복문 앞에 지정하고, 조건의 실행문에 break 라벨; 작성int result;unico: for(int dan = 1; dan = 30) break unico; System.out.print(dan + "x" + num + "=" + result + "\t"); } System.out.println();} co..
[Java] 제어문-if, switch / 반복문-for, while / 랜덤 함수 사용법 / final
·
Java
랜덤 함수 사용Math.random();이때 값의 범위: 0.0 -> 원하는 범위에 따라 식을 만들어서 범위 지정 예를 들어double rand = Math.random();System.out.println((int)(rand*6)); // 0~5 사이의 정수규칙: (int) (Math.random() * 개수) + 시작값개수: (마지막 값 - 시작 값 + 1)시작값: 말 그대로 범위의 첫 번째 숫자if와 else ifif만 쓰면 if가 참이어도 다른 if도 다 실행해 비효율적임if와 else if를 쓰면 if가 참일 땐 else if, .. else를 실행하지 않게 하여 실행 횟수 감소 → 효율적!주의: &&을 쓸 때 위의 조건과 아래 조건식 중 없어도 되는 조건이 있는지 확인if(score >= 90..