새소식

인기 검색어

개발일기

영속성 전이 엔티티가 영속성 컨텍스트에 올라가는 순간 / lambda와 익명 객체와의 차이 / PO와 기획자의 차이

  • -

계획

오늘 한 일

영속성 전이 엔티티가 영속성 컨텍스트에 올라가는 순간

ATDD 미션을 하다가 Section에 대한 POST 요청에서 Location 헤더에 id 값이 null이 찍히는 현상이 발견되었다.

 

코드는 다음과 같다. 신기하게도 동작은 제대로 하고있고, db에도 엔티티가 제대로 들어가고 있었다. 따라서 이건 영속성 컨텍스트의 문제가 아닐까 하는 생각이 들었다.

여기서 Section은 Line에서 ManyToOne으로 가지고 있고, OrphanRemoval = true, CascadeType.ALL을 준 상황이었다. 서비스 레이어가 지저분해지는 것이 싫어 SectionRepository.save()와 같은 동작은 따로 안 하고 Line.addSection()에서 영속성 전이를 통해 레코드를 추가하도록 만들었다.

개인적으로 생각했던 프로세스는 다음과 같았다


부모 엔티티에 자식 엔티티가 추가됨 -> 영속성 컨텍스트에 자식 엔티티가 추가됨 -> 자식 엔티티.getId() -> flush 후 db에 update

 

따라서 dto에서 새로 생성된 section에 대하여 getId()를 호출하도록 유도해서 생성된 레코드를 질의할 수 있도록 코드를 짰다. 그런데 아무리 돌려봐도 null 값이 나와서 혹시 모르는 마음에 디버거를 켜고 영속성 컨텍스트 상태를 하나하나 뜯어봤다.

 

Service 로직이 종료될 때까지 자식 엔티티는 영속성 컨텍스트에 등록되지 않았다. 그래서 null 값이 들어오고 있었던 것 같다.

 

오픈톡방에서 물어보니, flush() 되지 않으면 자식 엔티티는 영속성 컨텍스트에 등록되지 않는다고 한다. 따라서 실제 프로세스는 다음과 같았던 것이다


부모 엔티티에 자식 엔티티가 추가됨 -> 자식 엔티티.getId() -> flush / 이 시점에 자식 엔티티가 영속성 컨텍스트에 등록 -> db에 update

 

그래서 이 내용을 영한님 책과 하이버네이트 공식문서를 뒤져봤는데 찾을 수 없었다. 그 분은 도대체 어떻게 이걸 알고 계셨던 걸까...?

lambda와 익명 객체와의 차이

주요 차이로는 indy와 scope라고 생각된다

 

indy란 INVOKEDYNAMIC이라는 JVM의 opcode이다. JAVA 7에 등장했고, default 메서드나 lambda 동작을 처리할 때 호출된다

 

람다를 단순히 익명 클래스로 사용할 경우, 항상 새 인스턴스를 할당하기 때문에 람다식마다 클래스가 하나씩 생성된다는 문제가 존재한다. 이 비효율을 해결하기 위해 람다는 내부적으로 indy를 활용해 클래스를 한 번만 생성시키고 해당 람다식을 재호출시 재사용이 가능하도록 만든다.

 

또한 indy를 사용하게 되면 하위호환성을 보장하면서 Java 버전이 올라가더라도 개선의 여지가 존재한다

 

익명 클래스에서 로컬 클래스의 지역변수명과 익명 클래스의 지역변수명이 같으면 해당 식별자 호출시 익명 클래스의 지역변수가 호출되는 현상이 발생한다. 덮어씌운다는 점에서 쉐도잉이라고 부르는 것 같다.

 

이는 익명 클래스의 scope가 로컬 클래스의 메서드 내에서 한 번 더 scope를 생성하기 때문이다. 그러나 lambda의 경우 로컬 클래스의 lambda 호출 메서드와 scope를 공유하기 때문에 쉐도잉이 불가능하고, 식별자가 같으면 아예 컴파일 에러를 발생시킨다

 

추가적으로, lambda에서 effective final이라는 개념이 있는데 이게 재밌었다. lambda의 scope 안에 존재하는 지역변수는 final을 선언하지 않아도 final을 붙인 것과 같은 효과를 낸다. 이렇게 설계된 이유는, lambda scope 밖의 영역은 메서드이므로, 해당 지역의 지역변수는 stack에 생성된다.

 

그러나 lambda의 경우 익명 객체이기 때문에 힙 영역에 생성된다. 따라서 lambda의 scope에 존재하는 지역변수들은 인스턴스 변수라고 볼 수 있고, 쓰레드들 간 공유가 가능해진 것이다.

 

따라서 이를 막기 위해 도입된 개념이다.

 

공부한 내용 : https://hexagonal-boot-acb.notion.site/15-a61d9c121fa44f6db5f8c71538d80564?pvs=4
참조 : https://www.youtube.com/watch?v=xZrKKLI5V0U&list=PLfI752FpVCS96fSsQe2E3HzYTgdmbz6LU&index=25

PO와 기획자의 차이

최근 랜면디를 이끌기 위해 기획자 데이먼이라는 채널에서 기획 및 팀 운영에 대해서 공부하고 있다. 오늘 본 영상 중 하나는 https://youtu.be/yHNbFSXc2nc 이 영상인데, 이걸 보고 나서야 내가 만들고 싶은 형태가 개발자들이 PO가 되어 프로덕트에 대해 자발적으로 개발하는 구조라는 것을 깨달았다

 

PM / 기획자들은 CEO(비즈니스 의사 결정권자) / 개발자(기술 의사 결정권자) / 디자이너(UI / UX 의사 결정권자)들과 커뮤니케이션하며 제품 구현에 서포팅하는 역할을 한다.

 

이 과정에서 요구사항 분석 / 설계 / 일정관리, QA 업무를 수행하게 된다

 

서비스가 커지게 되면서 기능들이 많아지면, 기능별로 고도화하느라 고객 중심이 아닌 프로젝트 중심으로 서비스가 운영될 수 있다. 이때 등장한 것이 PO이다. PO는 기능별로 존재하며, 고객에게 딱 맞는 서비스를 제공하기 위해 개별적으로 업무한다. 좀더 애자일스러운 업무가 가능해 지는 것이다

일기

개발자가 PO가 되어야 한다?

요즘 드는 생각인데, 툴들이 발전하면서 개발자들에게 기술 뿐 아니라 비즈니스를 이해하고 이를 바탕으로 의사결정할 수 있는 능력이 필요해지는 것 같다는 생각이 든다. PO의 역할 비슷해져야 한다고 볼 수 있는 것 같다.

 

이에 대한 니즈가 있기 때문에 커뮤니케이션 능력이 점점 중요해 지는 것에 한 몫 하는 것 아닐까? 커뮤니케이션 능력이 뛰어난 사람들은 기술적 습득력을 떠나 도메인 습득력에서도 현저한 차이가 있다고 생각한다.

 

그런데... 이 PO가 되어 의사결정 하는 것도 정말 쉽지 않은 일이라는 걸 많이 느낀다.

 

최근 사이드 프로젝트로 협업을 경험하면서 비즈니스 의사결정권자는 나지만, 팀원들이 의견을 내면 다들 맞는 말들을 하기 때문에 나도 모르게 오락가락끼릭까락 하면서 다 좋네요 허허 하게 된다.

 

그러다 보면 뭔가 서비스의 방향성이 잘 안 잡히는 것 같고, 아 나조차도 내가 원하는 서비스가 뭔지 잘 모르는구나. 이래서 해결해야 하는 문제를 잘 정의해 놓고 그 목적을 잊지 않는 선에서 의사결정 해야 한다는 걸 느낀다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.