오픈세미나

Kernel360의 선택 과정으로 오픈세미나를 신청하여 준비 중이다. 오픈세미나는 크루들이 Kernel360에서 자체적으로 진행하는 기술세미나를 외부인에게 오픈하는 행사로 우아한테크코스의 테코톡과 비슷하다. 나는 이전에 11월 17일에 있었던 기술세미나를 데이터의 영속성으로 준비한 경험이 있는데, 이에 대한 조금 더 간략하고 명확한 정리와 심화된 내용으로 오픈세미나를 준비하고자 한다.

영상으로 촬영된 기술세미나는 다음과 같다.

Video Label

그리고 해당 발표에 대한 크루 블로그 글은 링크를 따라가면 볼 수 있다.


오픈세미나 OT

  • 일시 : 2023-11-28
  • 장소 : 패스트파이브 삼성 4호점 2층 회의실

오픈세미나는 지원자를 모집하여 선발하여 운영하게 되며, 운이 좋게 선정이 되었다. OT에서는 오픈세미나에 대한 간단한 안내와 신청할 당시의 주제에 대하여 숙고한 이후 확정하는 절차에 대한 설명을 들었다. 나는 따로 고민할 시간 없이 영속성에 대한 주제를 확정지었다.

오픈세미나 OT에서 안내받은 준비 일정이다. 오픈세미나는 발표 준비 과정에서 디렉터진들에게 피드백을 받을 수 있다는 점이 장점이 있다.

내용 분류 일자 비고
참여자 OT 미팅 2023년 11월 28일 주제 선정, 준비 사항 안내
내용 1차 안내 사전준비, 검토, 미팅 2023년 12월 7일 디렉터진 1차 피드백
내용 2차 안내 사전준비, 검토, 미팅 2023년 12월 18일 디렉터진 2차 피드백
최종 결과물 완성 사전준비 2023년 12월 22일  
오픈세미나 발표 2023년 12월 27일  

오픈세미나 1차 안내 및 디렉터진 피드백

  • 일시 : 2023-12-07
  • 장소 : 원격 피드백

주제가 확정될 당시 내가 제츨한 목차는 다음과 같다.

  1. 데이터의 영속성이 없을 경우 생기는일
  2. 데이터의 영속성이란?
  3. 데이터의 영속성 - 컴퓨터 아키텍처 관점
  4. Layered Architecture와 영속성
  5. 영속성 프레임워크 타임라인
  6. JDBC
  7. SQL Mapper
  8. ORM이란?
  9. ORM이 해결한 문제들
  10. Spring Data JPA를 사용했을 때 일어나는 일들
  11. ORM Deep Dive - JPA, Hibernate, Spring Data JPA
  12. Spring Data JPA는 항상 옳은 것인가? - There is no silver bullet

이에 따른 디렉터진의 피드백은 다음과 같이 정리될 수 있다.

  • 주어진 시간(15분)에 비해 목차가 지나치게 방대함
  • 중점으로 설명하고자 하는 것을 간단히 먼저 두괄식 정리할 것
  • 나머지는 결론을 위한 사이드로 비중을 잡다가 마지막에 중점으로 설명할 것으로 방점을 찍을 것

제출된 목차는 대부분 나열식으로 구성되어, 기술의 발전 양상을 테마로 잡고있는 것 외에 특별할 게 없다. 그리고 이대로 내용을 구성하면 이전에 진행한 기술세미나와 크게 다를게 없을 수 있다.

이전 기술세미나의 말미에 내가 조금 더 심화시켜 제공하고자 하는 내용은 다음과 같은 물음에 대한 대답이었다.

끝으로 그림 02

이번에는 상위에 있는 2개의 질문

  • ORM에서 객체와 테이블을 매핑시켰다는 것이 구체적으로 어떤 의미인가?
  • Spring Data JPA가 만능이 아니라면 어떤 대안이 있는가?

에 대한 나름의 고민을 중점 주제로 삼아 준비하고자 한다.

두번째 질문은 Spring Data JPA만을 표준으로 사용했을 때 생길 수 있는 문제점들을 간단히 정리하고 이어진 의문이라 어쩌면 “Spring Data JPA의 성능을 최적화하기 위한 방법에는 무엇이 있을까?”로 고치고 N+1문제에 대한 내용으로 돌리면 어떨까 한다.

이럴때 위 목차의 내용과 이전 기술세미나의 내용은 서두에 압축되고 다음과 같은 주제들이 목차로 구성될 수 있다.


  1. 데이터의 영속성 (2분)
    • 영속성에 대한 정의
    • 영속성의 중요성 - 없을 경우 생기는 일
    • 메모리 상에서 일어나는 도표 설명
  2. 영속성 프레임워크 타임라인 (1분)
    • JDBC, MyBatis, Hibernate
    • Kernel360에서 표준처럼 사용하고 있는 기술로 JPA가 있다는 것을 “짤막하게” 소개
  3. 은총알은 없다 (3분)
    • Spring Data JPA를 Hibernate로 구현하였을 경우 올바른 정렬이 일어나지 않는 사례 (w. Code)
    • 대규모 데이터 셋에서 성능 최적화의 한계
  4. 오늘의 중심 주제 (2분)
    • 영속성 프레임워크 JPA의 동작 - Layer 구조에 대한 상세 설명
    • N + 1 문제
  5. JDBC, JPA, Spring Data JPA (2분)
  6. N + 1 문제 (2분)
  7. N + 1 해결 방법들 (페치 조인, 배치처리) (1분)
  8. (옵션) JDBC와 JPA의 혼용 사례 (1분)
  9. 마치며 (1분)

오픈세미나 1차 피드백에 따른 내용 구성과 장표 만들기

  • 일시 : 2023-12-13
  • 장소 : 패스트파이브 삼성 4호점 2층 회의실

    • 큰 이야기를 다양하게 너무 짧은 시간에 하려고하는 경향이 있음
    • 발표는 두괄식으로 & 선택과 집중
    • 호기심을 끌 수 있는 제목을 쓸 것

Spring Data JPA에 대하여 비판적인 에세이 분석

JPA와 같은 JAVA진영의 ORM에 대한 나의 이야기를 하기위해 레퍼런스를 삼을만한 에세이를 읽어보았다. 영속성 부여에 대한 여러 메서드를 사용하고 각각을 데이터를 이용하여 분석하였으며, 링크는 다음과 같다. 에세이 링크

  • Spring Data JPA는 Spring Data 모듈 중에서도 가장 많이 사용되는 추가적인 레이어로서 EntityManager를 사용하지 않는 JPA라고 볼 수 있음.
  • Spring Data JPA를 사용한다면 주로 Hibernate를 구현체로 사용하게 되는데 이 에세이에서는 EclipseLink도 사용해 보았음.
  • MySQL과 연동된 데이터를 불러오는데 다음과 같은 내용의 비교를 진행함.

    • 실행되는 SQL 쿼리의 수

      • 로그를 직접 카운트함.
    • 데이터를 불러오는데 필요한 시간

      • 15번 시간을 측정하고 마지막 10번의 시간을 기록함.
    • 데이터가 정확하게 엔티티에 매핑이 되어있는지 여부
    • 데이터가 정확하게 정렬이 되는지 여부 (findAll(sort))
  • 블로그 결론

    • JDBC와 JPA findAll()메서드는 속도면에서 약 4배의 차이를 보임
    • 그나마 QueryDSL을 사용하면 속도를 JDBC와 비슷한 수준으로 맞출 수 있음
    • Hibernate에서 findAll(sort)메서드는 부정확한 결과를 내놓을 때가 있음
  • 블로그에 대한 나의 의견

    • ManyToMany매핑이 제대로 되어있지 않다.
    • 엔티티 정의에서 주인관계를 명확하게 설정하지 않았다.
    • 다대다 관계에서 테이블 관계와 다르게 연결 엔티티를 사용하지 않았다.
    • 속도적인 문제는 N + 1문제로 QueryDSL 등을 사용한 쿼리 조인으로 해결될 수 있는 것으로 JPA 자체의 기술적인 한계라고 보기는 어렵다.
    • findAll에서 Sort메서드가 부정확한 결과를 도출하는 부분은 검토가 필요할 것

오픈세미나 2차 피드백

  • 일시 : 2023-12-18
  • 장소 : 패스트파이브 삼성 4호점 2층 회의실

    • 수정된 장표를 가지고 간이 발표를 진행하여 2차 피드백을 받았다. 위에 정리된 에세이 내용을 토대로 내용을 작성했고 좋은 피드백을 많이 받을 수 있었다. 피드백의 내용은 다음과 같다.
      • 차트를 포함한 그래프는 세부사항을 상세하게 작성하여 정보의 누락이 없도록 할 것
      • 앞부분의 영속성과 ORM에 대한 내용을 즐이고 본인의 이야기를 많이 추가할 것
      • 불필요한 도식을 삭제하고 핵심만 추려 제시할 것

2차 피드백

오픈세미나 발표자료 완성 (그리고 그것을 위한 밤샘)

  • 일시 : 2023-12-25
  • 장소 : 내집

    • 오픈세미나를 며칠 남겨두고 발표자료를 완성했다. JPA가 패러다임 불일치를 “극복”하는 몇가지 방식의 내용을 추가하고 보강하여 완성도를 조금 더 올렸다. 어떤 발표든지 “완성”이라고 할 만큼 만족스러운 장표를 만드는 것은 어려워 보인다.
    • 하지만, 기술세미나와 연계하여 영속성 계층에 필요한 Java진영의 다양한 프레임워크를 연구하고 소개하는 시간을 가져보는 것은 나름 의미있는 시간이었다고 생각한다.

원래는 23일 완성으로 계획되어 있지만 몇가지 “나의 이야기”를 위한 데이터 생산을 위해 조금 더 시간이 필요했다.

오픈세미나 당일

  • 일시 : 2023-12-27
  • 장소 : 서울 강남구 역삼로 180 지하 1층

    • 발표 전 생각

      • 얇고 긴 긴장이 꾸준히 이어지고 있다. 오픈세미나 차례를 기다리며 글을 쓰고 있는데, 생각보다 많은 사람들이 와서 놀랐다. 위치는 역삼역에서 내리고 2-1번 출구 방향으로 내리걷다보면 있는 마루180의 지하 컨퍼런스 룸에서 진행된다.

      • 나름 장표를 만들고 여러번 읽었는데 잘할 수 있을지 잘 모르겠다. 늘 그렇듯이 말하고 싶은 핵심내용을 지니고 올라가서 관객들과 (비언어적으로)소통하며 진행하고 싶다.

    • 발표 후 생각

      • 준비한대로 대부분의 이야기를 할 수 있었다. 하지만 긴장한 탓에 나의 방식대로 발포를 주도하지는 못한 것 같다. 나름 전문적이고 지적인 발표를 계획했는데, 아무래도 깊이를 내세온 테마에 부합할 수 있을 정도로 준비가 완벽하지는 않았던 것 같다.

      • 발표가 끝난 후 소소한 뒤풀이를 했는데 나름 일을 한건하고 잘 마무리를 하는 느낌이 들었다.

오픈세미나 01 오픈세미나 01

소감

오픈세미나를 준비하면서 들었던 생각은 좋은 개발자 되려면 어느정도 “덕력”이 있어야한다는 것이다. 코드는 아주 사소해 보이는 차이를 지니면서 개발자들에게 다양한 고민거리를 안겨준다. 하지만 그런 소소한 차이점이 이후 어떤 파급효과를 지니게될지는 알 수 없다. 그런 것들을 하나하나 빠지지 않고 기억하는 것이 좋은 개발자가 지녀야할 덕목이 아닌가 싶다.

섬세함과 파고드는 능력은 배움의 길에 반드시 필요하고, 열심히 배운다는 것은 그런 힘을 키우는 가장 좋은 방법이라 생각이들었다. 마지막으로 발표에서도 인용한 구절을 적으며 오픈세미나를 마무리하겠다.

발표 전 : 얇고 긴 긴장이 꾸준히 이어지고 있다. 오픈세미나 차례를 기다리며 글을 쓰고 있는데, 생각보다 많은 사람들이 와서 놀랐다. 위치는 역삼역에서 내리고 2-1번 출구 방향으로 내리걷다보면 있는 마루180의 지하 컨퍼런스 룸에서 진행된다.

나름 장표를 만들고 여러번 읽었는데 잘할 수 있을지 잘 모르겠다. 늘 그렇듯이 말하고 싶은 핵심내용을 지니고 올라가서 관객들과 (비언어적으로)소통하며 진행하고 싶다.


발표 후 : 후련하지만 조금 아쉬운 발표였다. 조금 더 기술적으로 깊이있는 내용이 있으면 어땠을까하는 생각이다. 앞으로 3년차 5년차 개발자로 일을 하면서 조금 더 깊이 아는, 큰 그림을 그릴 수 있는 사람이 되길 바래본다.

“나는 그것을 ‘지혜의 넓이’라고 생각한다.

더 나아가 지혜에는 대상을 깊이 살펴보는 ‘깊이’라는 측면이 있다.

그리고 결단력을 유도하는 ‘힘’이라는 측면도 있다.

그러므로 나는 ‘왜 배워야 하는가?’라는 질문에 대하여, 이러한 ‘지혜’를 얻기 위해서라고 대답하고 싶다.”

학문의 즐거움 by 히로나카 헤이스케