본문 바로가기

728x90
반응형

Dev.

(47)
[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..
[Spring] JPA N+1 문제 상황 요약단건 조회시 1:N 양방향 관계로 설정된 A 엔티티와 연결된 B 엔티티 목록을 함께 내려주는 기능을 구현해야 했다.@Entitypublic class Todo { @OneToMany(mappedBy = "todo", fetch = FetchType.LAZY) private List comments = new ArrayList();}@Entitypublic class Comment { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "todo_id") private Todo todo;} Todo를 불러와 그 안의 todo.getComments()를 호출했을 때 다음과 같이 쿼리 두번이상 실행되는 문제가 발생했다.select..
[Error] JPA 양방향 연관관계에서 무한 루프문제 해결 문제단건 조회시 해당 엔티티에 딸린 댓글들을 가져올 때 엔티티를 그대로 반환하면서 무한 루프 문제가 발생했다.Todo와 Comment는 서로 양방향 연관관계로 연결되어있다. 원인@RestController는 반환값을 자동으로 JSON 직렬화한다고 한다. 그때 양방향 연관관계에서 Jackson이 Todo 객체를 JSON으로 변환하려 함Todo 내부의 comments를 직렬화하려 함각 Comment는 다시 todo를 가지고 있어서 Todo 직렬화 시도Todo → Comment → Todo → Comment … 🔁와 같은 순환문제가 발생한다. 즉, 객체가 서로를 참조하고 있어서 JSON 변환이 무한 루프에 빠지는 것해결해결방법은 여러가지가 있다고 하는데 나는 @JsonManagedReference / @Js..
[Error] 일정 트러블 슈팅 어려웠던 부분1.JPA 관계 설정ERD도 그려봤고 엔티티에도 다대일 일대다 양방향 관계 설정도 했다. 문제는 DTO. 사실 그냥 내 문제잘못된 설계Comment comment = new Comment( request.getContent(), request.getUsername(), request.getPassword(), request.getTodo() // ❌ request에서 Todo를 직접 받음);이건 request DTO에 Todo 엔티티가 직접 들어있다는 전제인데, 클라이언트는 Todo 엔티티 구조를 모름 Todo의 id만 알고있음DTO는 엔티티를 몰라야함!!또한 JPA가 관리하지 않는(영속되지 않은) Todo 객체가 들어가면 연관관계가 깨질 수 있음DTO는 단순히 데이..
[Spring] JPA 관계 설정(1:N/N:1) JPA 관계 설정ERD에서 DB간 관계를 설정했다면 그 관계를 자바 객체 수준에서 반영하는 과정을 의미한다. 즉 ERD 테이블 관계를 코드로 옮겨온다 라고 이해하면 될 것 같다. ERDJPA 관계 설정표현 대상데이터베이스자바 객체단위테이블엔티티 클래스관계 표현PK/FK어노테이션 (@OneToMany, @ManyToOne)주 언어SQL, 다이어그램Java역할설계구현결과DB 스키마코드 로직에서의 연결JPA 관계 설정 핵심 키워드 정리1. @OneToMany / @ManyToOne — 가장 기본적인 관계 표현의미1:N 관계 (예: Todo 1개 → Comment 여러 개)N:1 관계 (예: Comment 여러 개 → Todo 1개)키워드 포인트외래키(FK) 는 항상 N 쪽(다수 쪽) 에 존재한다.→ 그래서 @..
[Spring] 수정 사항 발생시 자동 리빌드 Auto Reload API 구현 후 포스트맨에서 통신할 때 수정 사항이 발생하면 서버를 껐다 켜서 컴파일 시켜야했다. 수정사항이 얼마나 많은데 그때마다 서버 껐다 킬 수는 없으니 방법을 알아보다 핫 리로드 설정을 보게 되었다.왜 서버를 껐다 켜야 수정사항이 반영되는 걸까?java는 코드를 컴파일러가 기계어로 번역 후 실행하는 컴파일 언어다. 저장 즉시 실행되는 것이 아니라 컴파일 -> 클래스 로딩 -> 실행 순의 순서가 필요하다. 프로그램이 실행될때 CPU가 바로 기계어를 읽을 수 있어서 빠르지만 개발자가 코드 수정시 재컴파일 해야한다는 단점이 있다. 즉 자바의 특성을 이해하면 알 수 있다.핫 리로드 서버를 껐다 켜지 않아도 코드 수정이 즉시 반영되게 하는 개발 환경 설정장점코드 저장 순간 인텔리제이가 자동 빌드, 변경된..
[Java] 반복문 대신 재귀로 코드의 의도를 드러내기 과제에서 readUserInput() 메서드에 잘못된 입력이 들어오면 while문으로 유효한 조건의 입력이 들어올 때까지 반복하도록 구현했다. 과제 해설을 들으며 재귀함수를 사용해 직관적으로 나타낼 수 있었다는 사실을 알았다. 동작은 같아도 사고의 방향이 다르단거에 다시한번 개발의 매력을 느끼며 반복문과 재귀에 대해 알아보려고 한다. 재귀함수란?재귀 함수(Recursive Function)는 자기 자신을 다시 호출하는 함수로, 큰 문제를 작은 하위 문제로 나누어 해결할 수 있을 때 사용된다.장점“다시 시도한다”는 의미 구조가 코드에 자연스럽게 드러남깔끔하고, 로직이 분리돼 읽기 쉬움단점스택 프레임이 쌓이기 때문에 너무 많은 입력을 재귀로 처리하면 StackOverflowError 가능성 있음 ( 입출력은..
[내배캠] 한달 회고 벌써 다시 개발을 시작한지 한달이 흘렀다. 이 소중한 시간을 어떻게 보냈는지 되돌아보려고 한다.들어가기이번 달은 본격적으로 Java 개발자를 목표로 공부를 시작한 첫 달이었다. ‘객체지향’이라는 말이 어렵게만 느껴졌지만, 직접 코드를 써보면서 조금씩 감이 오기 시작했다. 자바 기간 주요 목표는 기본 문법과 컬렉션 등, 그리고 객체 설계 감각을 익히는 것이었다.한달 동안의 학습은 커리큘럼 강의와 자바 문법은 프로그래머스 문제들로 익혀갔다.어려웠던 점 & 해결과정건강상의 이유로 개발을 그만둔지 너무 오래된 상태였어서 다시 기본으로 돌아가는 것 자체가 힘들고 어려웠다. 그전에 이만큼 했으니까 더 잘해야 할텐데 라던지 더많이해야할텐데 같은 내 현실을 직시하고 기본기를 다지는 그 시작부터 어려웠다.그래서 한달..

728x90
반응형