전체 글103 [sql] GROUP BY - SELECT 에 아무 열이나 못 쓰는 이유 그룹당 하나로 정해지지 않는 열은 SELECT에 올 수 없다. 엔진마다 막는 강도가 달라 SQLite에서는 조용히 틀린 값이 나온다.GROUP BY로 집계하려는데 "must appear in the GROUP BY clause" 오류가 납니다. 필요한 열을 다 넣으면 그룹이 잘게 쪼개져서 원하는 결과가 안 나옵니다. 어떤 데이터베이스에서는 그냥 잘 돌아가서 더 헷갈립니다.그룹당 하나여야 한다GROUP BY city 는 도시별로 행을 한 줄씩 만듭니다. 그러면 그 한 줄에 name 을 쓸 수 없습니다 — 서울 그룹에 두 사람이 있는데 어느 이름을 보여 줄지 정해지지 않기 때문입니다.그래서 SELECT 의 모든 열은 둘 중 하나여야 합니다. GROUP BY 에 들어 있어 그룹마다 값이 정해지거나, COUNT.. 2026. 9. 18. [java/spring] Bean Validation - 애노테이션은 표시고, 검증은 부르는 쪽이 한다 제약 애노테이션은 그 자체로 아무것도 막지 않는다. 경계에서 검증기를 부르는 자리가 있어야 실행되고, 위반은 첫 실패에서 멈추지 않고 전부 모여 돌아온다.요청 DTO에 @NotBlank 와 @Email 을 붙여 뒀는데 빈 값이 그대로 저장됩니다. 컨트롤러에서는 잘 걸리는데, 다른 경로로 들어온 같은 객체는 검증을 안 거칩니다. 애노테이션이 붙어 있으면 어디서든 막아 줄 거라고 생각했습니다. Bean Validation 이 그렇게 동작하는 줄 알았습니다.붙여 두는 것과 검사하는 것은 다르다Bean Validation 에서 @NotBlank 같은 제약 애노테이션은 필드에 표시를 남기는 일입니다. 자바 애노테이션은 그 자체로 코드를 실행하지 않습니다. 실제 검사는 그 표시를 읽어 규칙을 돌리는 검증기가 하고,.. 2026. 9. 17. [java/spring] @Scheduled - 기본 스케줄러는 스레드가 하나다 스케줄러의 기본 스레드 수는 하나라, 오래 걸리는 작업 하나가 나머지 전부를 밀어낸다. 그리고 인스턴스를 늘리면 같은 작업이 여러 번 돈다.매분 도는 정산 작업이 있고, 5초마다 도는 헬스 체크 작업이 있습니다. 정산이 오래 걸리는 날이면 헬스 체크 로그가 통째로 비어 있습니다. 두 작업은 아무 관계가 없는데도 그렇습니다. 게다가 서버를 두 대로 늘린 뒤로는 정산이 두 번 돕니다. @Scheduled 는 그냥 붙이기만 하면 되는 줄 알았습니다.하나가 막으면 전부 밀린다@Scheduled 를 붙이면 스프링이 스케줄러를 만들어 등록합니다. 이때 스케줄러 빈을 따로 정의하지 않으면 스레드가 하나뿐인 기본값이 쓰입니다. 프레임워크만 쓰면 기동 로그에 스케줄러 빈을 못 찾았다는 안내가 조용히 지나가는데, 그 뜻이.. 2026. 9. 17. Spring Boot - Spring을 대체하는 것이 아니라 설정을 대신해 주는 것 Spring Boot는 Spring Framework 위에 자동 설정과 스타터를 얹은 것이다. 컨테이너도 DI도 그대로이고, 달라지는 것은 설정을 누가 적느냐다.강의를 보면 어떤 곳은 Spring, 어떤 곳은 Spring Boot로 시작합니다. 둘을 따로 배워야 하는지, Boot만 알면 되는지 모르겠습니다. @SpringBootApplication 하나만 붙였는데 웹 서버가 뜨는 것도 이해가 안 갑니다. Spring Boot가 정확히 무엇을 대신해 주는 것인지가 안 잡힙니다.대체가 아니라 위에 얹은 것이다가장 먼저 정리할 것은 둘이 경쟁 관계가 아니라는 점입니다. Spring Boot 프로젝트에서 @Service를 붙이고 생성자 주입을 받는 코드는 전부 Spring Framework의 기능입니다. 컨테이.. 2026. 9. 17. [java/spring] @Async - 프록시를 지나지 않으면 그냥 메서드 호출이다 @Async는 프록시가 거는 것이라 같은 객체 안에서 부르면 동기로 돈다. void를 반환하면 예외가 호출한 쪽에 닿지 않고, 기본 실행기에는 상한이 없다. 무거운 리포트 생성을 @Async 로 돌렸는데 응답이 그대로 느립니다. 로그를 보니 작업이 요청 스레드에서 실행되고 있습니다. 애노테이션은 분명히 붙어 있고 설정도 켜 두었습니다. 다른 클래스에서 부를 때는 잘 되는데, 같은 서비스 안에서 부를 때만 그렇습니다.누가 비동기로 바꿔 주는가@Async 는 메서드를 비동기로 만드는 마법이 아닙니다. 스프링이 그 빈을 감싼 프록시를 만들고, 프록시가 호출을 받아 실행기에 넘기는 구조입니다. 즉 비동기가 되는 것은 프록시를 지날 때뿐입니다.그래서 같은 객체 안에서 this.method() 로 부르면 프록시를 .. 2026. 9. 17. 이전 1 2 3 4 ··· 21 다음