Java
글 9개
2026
- 자바 형변환과 부동소수점 오차: 0.1은 처음부터 0.1이 아니었다
자바 char 정수 변환, int 나눗셈 결과 타입, float double 0.1 오차와 IEEE 754, possible lossy conversion 에러, 리터럴 기본 타입까지 — 자바의 정석 2장에서 틀린 문제들의 원인 정리.
- javac 컴파일 2단계와 에러 읽는 법: 컴파일은 없는 게 아니라 한 번만 하는 것이었다
자바는 컴파일이 필요없다는 오해부터 javac와 java의 차이, 컴파일러가 에러를 한 번에 다 알려주지 않는 이유까지. 에러 개수가 실수 개수와 다른 이유와 줄 번호를 믿지 말아야 할 때를 정리한다.
- 스프링 DI·@Transactional·MyBatis: 프론트 개발자가 자바 코드를 읽기 시작할 때 (프레임워크편)
스프링 의존성 주입으로 new를 안 쓰는 이유, @Transactional 동작, @Valid 빠뜨리면 검증이 안 되는 것, MyBatis가 인터페이스만으로 도는 원리, Mockito verify와 never 사용법.
- 자바 record·Optional·애노테이션: 프론트 개발자가 자바 코드를 읽기 시작할 때 (문법편)
자바 record와 Optional, 애노테이션이 뭔지, Entity와 DTO를 나누는 이유를 TypeScript에 빗대 정리했다. 프론트 개발자가 스프링 코드를 읽기 시작할 때 필요한 문법만.
- JDBC printStackTrace의 함정: 실패했는데 종료코드가 0이었다
printStackTrace는 예외를 찍기만 하고 종료코드 0으로 끝낸다. DB가 죽었는데 CI가 성공으로 보는 이유. JDBC 커넥션 닫는 순서, PreparedStatement를 쓰는 두 가지 이유까지.
- 톰캣 WAR 배포 3단계: 만들기·넣기·켜기는 다른 일이었다
톰캣에 WAR 배포하는 법. mvn package는 만들기까지고 webapps 복사와 톰캣 실행은 별개다. WEB-INF가 뭔지, provided 의존성이 왜 WAR에 안 들어가는지까지.
- 서블릿 생명주기와 스레드 공유: 서블릿은 톰캣이 하나만 만들어 돌려쓰는 객체였다
서블릿은 톰캣이 하나만 만들어 여러 스레드가 공유한다. 필드에 값을 담으면 안 되는 이유, doGet을 누가 부르는지, doPost를 안 만들면 405가 나는 이유까지.
- maven archetype 버전 함정: 생성기가 만들어준 기본값은 내 환경 기준이 아니었다
maven-archetype-webapp이 만든 pom.xml 컴파일 버전 1.7, web.xml 2.3 때문에 안 돈다. javax와 jakarta 차이(톰캣 9 vs 10), 버전이 세 군데 흩어져 있는 문제까지.
- Maven vs Gradle 선택 기준: web.xml과 pom.xml은 XML만 같았다
web.xml과 pom.xml은 확장자만 같고 읽는 주체가 다르다. Gradle과 web.xml도 같이 쓴다. Maven과 Gradle 중 무엇을 고를지, 속도보다 중요했던 판단 기준.