728x90
반응형

전체 글 91

[Spring] record DTO 클래스

응답 DTO 클래스를 만들다보면 인텔리제이에서 Convert to record 표시가 뜬다. 단순히 코드 추천인 줄 알고 넘어갔는데왜 응답 DTO에 추천이 뜰까 생각하며 record 클래스를 알아보게 되었다.record 클래스자바 14부터 도입된 불변 객체를 간편하게 생설할 수 있는 새로운 타입. record는 주로 데이터를 보관하는 객체로 사용되며, 기본적인 작업들을 자동으로 처리해주기 때문에 간결하고 효율적이다.특징1. 불변 객체객체가 생성된 후, 필드를 변경할 수 없다.final로 처리된 필드만 사용하기 때문에 불변성 보장2. 자동 생성 메소드getter, toString(),equals(),hashCode() 메소드가 자동으로 생성필드를 기반으로 계산되므로, 객체의 값을 비교하거나 문자열로 출력할..

Dev./Spring 2025.11.17

[Java] 최댓값 최솟값

문제문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.Psuedo Codenumbers -> s를 공백 기준으로 나눈 배열min -> 정수 중 가장 큰값 max -> 정수 중 가장 작은 값for 반복문 numbers n -> 정수로 변환한 값 int if n이 min보다 작으면 min = n if n이 max보다 크면 max = n return min 공백 max 합친 문자열min에 가장큰값, max에 가장 작은 값을 담..

알고리즘 2025.11.16

[Error] 일정 관리 트러블슈팅 1 - URI 설계 (User)

문제 상황 처음에 User URI 설계를 다음과 같이 진행했다.PATCH /users/{userId}POST /users/{userId}/delete이때 서비스 단에서는User user = globalValidator.findOrException(userRepository, userId);globalValidator.matchPassword(user, request.getPassword());globalValidator.forbiddenErrorHandler(user, sessionUserId);forbiddenErrorHandeler 메소드로 URL로 전달된 userId, 세션에 저장된 로그인 유저의 userId가 일치하는지 매번 검증하지만 여기서 문제가 발생했는데문제 분석1.URL 조작 위험클라이언트..

BootCamp 2025.11.15

[Error] 일정 관리 트러블 슈팅 2- 양방향vs단방향

첫번째 트러블슈팅 [Error] 일정 관리 트러블슈팅 3 - URI 설계 (User)이전 트러블슈팅 [Error] 일정 관리 트러블 슈팅 1 - 제네릭제네릭이 개념중에 가장 코드 적용으로 바로 이어지기 힘든 부분이었다. 필수과제 구현까지 총 3번의 제네릭 활용 리팩토링을 해보았는devz0.tistory.com문제제네릭이 문법적으로 가장 시간이 많이들어갔다면 양방향 단방향 연관 관계설정은 생각을 정리하느라 시간이 많이 소요됐다.리팩토링을 진행하며 User, Schedule, Comment 세 도메인 간 연관관계를 다시 보던 중, “단방향으로 유지할지, 양방향으로 전환할지” 판단이 애매했다. 특히, 단건 조회에서 일정과 댓글을 함께 보여주는 엔드포인트 설계를 하며 “일정 단건 조회시 댓글목록을 항상 참조하..

BootCamp 2025.11.14

[Spring] DELETE 메소드에 RequestBody를 지양해야 하는 이유

글 삭제시 유저가 입력한 패스워드와 작성자의 패스워드 일치시 삭제를 구현해야했는데 강의대로 따라가다보니 @DeleteMapping과 @RequestBody를 같이사용하게 되었다.피드백HTTP Method중 GET과 DELETE에서 RequestBody의 사용은 지양해야 합니다. 지금은 HTTP Method를 정의한 문서에서 GET과 DELETE에서 RequestBody(요청 본문)의 의미가 정의되어있지 않기 때문입니다. 다시말해 요청본문이 있어도 그것이 어떤역할을 해야할지 명확하지 않아 무시되거나 거부될 수 있습니다. 실무적인 관점에서는 사용하는 라이브러리/프레임워크/버전에 따라서 DELETE에 요청본문을 허용하지 않는 것들이 있습니다.또한 일반적으로 DELETE에 요청본문을 넣지 않는다는 룰이 있어 다..

Dev./Spring 2025.11.13

[Spring] Filter

Filter란?Filter는 Spring 전용 기술이 아닌, 자바 서블릿(Java Servlet) 표준 스펙에서 제공하는 기능이다.즉, Spring이 등장하기 전부터 톰캣(Tomcat), 제티(Jetty) 같은 서블릿 컨테이너 수준에서요청과 응답을 가장 먼저 가로채어 처리하는 구조다.Spring Boot는 이런 Servlet Filter를 내부적으로 자동 등록하고Spring 애플리케이션의 맨 앞단(DispatcherServlet 이전) 에서 실행되게 해준다.동작 구조클라이언트 요청 ↓[Filter] ─── Servlet 레벨 (보안, 인코딩, 인증) ↓DispatcherServlet ─── Spring MVC 진입점 ↓[Interceptor] ─── Spring 레벨 (로깅, 권한 검증,..

Dev./Spring 2025.11.13

[Error] Port 8080 was already in use

문제새로운 스프링 프로젝트 테스트 실행시 다음과 같은 오류가 콘솔창에 뜸Port 8080 is already in useIdentify and stop the process that's listening on port 8080 or configure this application to listen on another port.8080 포트를 이미 다른 프로세스에서 사용 중이라는 뜻나는 분명 이전 프로젝트 서버를 껏는데?이전 프로젝스 서버 죽이고 새로운 프로젝트를 실행했다.개발 중 의도치않게 포트가 점유된 상태로 서버가 백그라운드로 남는 경우가 종종 있다고 한다.appication.properties 파일에서 포트를 예를들어 8081 로 바꿔줄수도 있지만 정석대로 원인을 해결하는 방법으로 정함.상황 진단터..

Dev./Error. 2025.11.11

[Spring] JPA 영속성 컨텍스트

영속성 컨텍스트데이터베이스와 애플리케이션 사이에 JPA가 만든 임시 저장소(캐시)영속성 컨텍스트의 역할역할설명이해를 위한 비유① 1차 캐시같은 엔티티를 두 번 조회해도 DB에 다시 안 감한 번 불러온 책은 책상 위에 둔다② 변경 감지 (Dirty Checking)엔티티의 필드가 바뀌면 자동으로 UPDATE 감지책을 수정하면 포스트잇으로 표시해둔다③ 쓰기 지연 (Flush 시점에 DB 반영)INSERT, UPDATE, DELETE가 트랜잭션 끝날 때 실행됨숙제는 한 번에 제출한다DB 접근을 최소화한 ORM이 효율적인 ORM생명주기에 따른 4가지 상태상태설명예시비영속 (new)아직 JPA에 저장 안 됨new Todo("공부")영속 (managed)EntityManager에 저장되어 관리 중em.persist..

Dev./Spring 2025.11.10

[Java] 대충 만든 자판

문제 설명휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.예를 들어, 1번 키에 "A", "B", "C" 순서대로 문자가 할당되어 있다면 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"가 되는 식입니다.같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 심..

알고리즘 2025.11.09

[Error] MySQL 버전 충돌 (macOS/Homebrew)

예전에 공부용으로 homebrew로 설치된 mysql이 있었는데 이번에 예제 따라간다고 웹에서 MySQL 8.4 dmg를 추가 설치하면서 두 버전이 같은 포트와 데이터 디렉토리를 공유하며 지속된 충돌문제가 발생했다.발생된 로그로그설명Unable to lock ./ibdata1 error: 35InnoDB 데이터 파일(ibdata1)을 중복 프로세스가 잠그려 함Can't connect to local MySQL server through socket '/tmp/mysql.sock'이미 다른 인스턴스가 포트를 점유하거나 소켓 경로 다름Access denied for user 'root'@'localhost'root 인증 플러그인 꼬임 (caching_sha2_password ↔ mysql_native_pas..

Dev./Error. 2025.11.08
728x90
반응형