게시판 목록에서 페이지 번호가 한 칸씩 밀리거나 이전 다음 버튼이 엉뚱한 곳으로 가면 먼저 JSP pagination page link 계산 기준을 확인해야 한다. 이 글은 totalCount, currentPage, pageSize, blockSize로 페이지 번호를 만들고 JSP에서 링크로 출력하는 기준을 정리한다.페이징은 화면 장식처럼 보이지만 실제로는 서버 계산, SQL 조회 범위, JSP 링크, 검색 조건 유지가 같이 맞아야 동작한다. 한 곳만 틀려도 첫 페이지는 정상인데 마지막 페이지에서 깨지거나, 검색 후 2페이지로 가면 조건이 사라지는 문제가 생긴다.핵심 결론: JSP pagination은 전체 건수와 현재 페이지로 서버에서 페이지 블록을 계산하고, JSP는 계산된 값만 기준으로 링크를 출..
Categories
Java 16
문자열 null 체크와 날짜 계산 코드가 반복되면 먼저 Apache Commons StringUtils DateUtils로 줄일 수 있는 부분을 확인한다. 이 글은 공백 문자열, Date 계산, 검색 조건 처리 기준을 정리한다.Apache Commons Lang은 대단한 프레임워크라기보다, Java 기본 API로 매번 직접 작성하던 자잘한 처리를 줄여 주는 유틸 모음에 가깝다. 특히 StringUtils는 null과 공백 문자열 처리에, DateUtils는 오래된 Date, Calendar 기반 프로젝트의 날짜 계산에 자주 쓰인다.핵심 결론: StringUtils는 null-safe 문자열 체크에 강하고, DateUtils는 레거시 Date/Calendar 코드에서 날짜 더하기, 절삭, 파싱을 단순하게 ..
HashMap에 값을 넣었는데 같은 값으로 조회해도 null이 나오거나, HashSet이 같은 객체처럼 보이는 데이터를 중복으로 담는다면 먼저 equals()와 hashCode()를 확인해야 한다. 데이터가 사라진 것이 아니라, 객체를 비교하고 찾는 기준이 컬렉션이 기대하는 방식과 맞지 않는 경우가 많다.이 문제의 중심에 equals()와 hashCode()가 있다. 둘은 단순히 객체 비교 문법이 아니라, HashMap, HashSet, HashSet 기반 중복 제거, 캐시 키, DTO 비교에서 실제 동작을 바꾸는 기준이다. 한쪽만 구현하거나, 비교 기준이 바뀌는 필드를 키로 쓰면 실무에서 원인 찾기 어려운 버그가 된다.핵심 결론: 객체를 값 기준으로 비교하려면 equals와 hashCode를 같은 기준..
Java에서 null 처리를 줄이려고 Optional을 도입했는데, 막상 코드를 보면 Optional.ofNullable()이 곳곳에 흩어지고 isPresent() 뒤에 get()을 호출하는 코드만 늘어나는 경우가 있다. 이런 상태라면 null 체크가 줄어든 것이 아니라, null 체크가 Optional 모양으로 바뀐 것이다.Optional은 null을 완전히 없애는 문법이 아니다. "이 메서드의 결과는 없을 수 있다"는 사실을 호출하는 쪽에 명확히 알려주는 도구에 가깝다. 그래서 어디에 쓰느냐가 중요하다. 반환값에는 도움이 되지만, DTO 필드나 메서드 파라미터에 무분별하게 넣으면 오히려 코드가 더 읽기 어려워진다.핵심 결론: Optional은 null 체크를 예쁘게 감싸는 도구가 아니라, 결과가 없을..
Java 코드를 실행했는데 NullPointerException이 뜨면 대부분은 "어디가 null인지"부터 찾기 시작한다. 그런데 줄 번호만 보고 바로 값을 넣어 버리면 같은 오류가 다른 위치에서 다시 난다. 이 오류는 단순히 null 체크를 빠뜨려서 생기는 경우도 있지만, 실무에서는 요청 파라미터, DB 조회 결과, Map 조회, MyBatis 매핑, Spring 의존성 주입처럼 값이 넘어오는 경로가 끊겼을 때 더 자주 발생한다.이 글은 NullPointerException을 만났을 때 무엇을 먼저 확인해야 하는지, 어떤 코드가 위험한지, 어디까지 방어하고 어디서 예외로 처리해야 하는지를 실무 흐름에 맞춰 정리한다. 목표는 모든 곳에 if (value == null)을 붙이는 것이 아니라, null이 ..
Java 파일 입출력(File I/O) 완전 정복: 실무 예제부터 인코딩·복사까지Java로 개발하다 보면 파일 입출력은 피할 수 없는 작업 중 하나입니다. 단순히 로그 파일을 쓰거나, 설정 값을 읽거나, 데이터를 백업하는 것부터 이미지 파일을 복사하거나, 외부 API 응답을 저장하는 등 다양한 곳에서 쓰입니다.하지만 막상 직접 구현하려고 하면 예외 처리, 스트림 닫기, 인코딩 문제 등 생각보다 번거로운 부분이 많습니다. 특히 파일을 잘못 다뤄서 데이터가 유실되거나 서버가 뻗는 경우도 있죠.이 글에서는 자바에서 파일 입출력을 처리하는 다양한 방법과 실무에서 자주 사용하는 예제를 하나씩 정리해보겠습니다.1. BufferedReader로 한 줄씩 읽기가장 일반적이고 안정적인 파일 읽기 방식입니다. 성능도 좋고..
자바 객체 복사의 모든 것: 깊은 복사 vs 얕은 복사의 차이와 실전 예제개발 중 객체를 복사해서 다른 곳에 넘겼더니, 원본 객체 값이 바뀌는 황당한 일이 발생한 적 있으신가요?“어? 분명 복사했는데 왜 원본까지 같이 바뀌지?”이런 상황은 대부분 얕은 복사(shallow copy) 때문입니다. Java에서 객체를 복사할 땐 얕은 복사와 깊은 복사의 개념을 정확히 이해하고 있어야 예상치 못한 버그를 막을 수 있습니다.이번 글에서는 자바에서 얕은 복사와 깊은 복사의 차이를 명확히 정리하고, 각각을 구현하는 방법과 실전에서 주의할 점을 코드 예제와 함께 소개합니다.얕은 복사(Shallow Copy)란?얕은 복사는 객체 자체만 새로 만들고, 내부 참조 필드는 그대로 공유하는 복사 방식입니다. 즉, 내부에 또 다..
NullPointerException 때문에 실무에서 당황한 적 있으신가요?개발 중 잘 돌아가던 코드가 갑자기 NullPointerException을 터뜨릴 때가 있습니다. 특히 실서비스에서 이런 예외가 발생하면, 사용자는 화면이 멈추고 로그에는 스택트레이스가 한가득... 😓이런 실수를 방지하려면 사전에 점검하고 방어 로직을 갖추는 습관이 중요합니다.이번 글에서는 Java에서 NullPointerException (이하 NPE)을 방지하기 위한 다양한 팁을 상황별로 정리해보겠습니다.1. NPE가 주로 발생하는 상황객체 초기화 없이 메서드 호출의존성 주입 실패 (Spring 등에서 @Autowired 객체가 null)컬렉션 내부 요소가 null인데 접근 또는 연산 시도Optional을 사용하지 않고 무조..
Java HashMap vs Hashtable vs ConcurrentHashMap: 동시성과 성능의 완벽 가이드내부 구조와 동작 원리HashMap: 단일 스레드 최적화 설계HashMap은 배열과 연결 리스트(또는 레드-블랙 트리)를 조합한 해시 테이블로 구현됩니다. 키의 해시코드를 배열 인덱스로 변환하여 O(1) 평균 시간 복잡도로 접근합니다.// HashMap 내부 구조 개념Node[] table; // 버킷 배열static class Node { final int hash; final K key; V value; Node next; // 충돌 시 체이닝}Java 8부터 동일 버킷에 8개 이상의 노드가 충돌하면 연결 리스트를 레드-블랙 트리로 변환하여 최악의 경우 O(log n)..