[우아한테크코스 6기] 레벨 2: 5주 차 회고

,

이번 주는 수요일에 쉬는 날이 있어서 이틀 이틀 잘 끊어가며 다녀왔다. 화요일부터 새로운 미션이 시작돼 살짝 압박이 있기도 했지만, 어찌저찌 잘 마무리돼 화, 목에만 열심히 달려서 미션을 마무리했다. 클라이밍도 다녀오고, 일요일 캠퍼스도 구경해서 한 주를 알차게 지냈다. JPA와 함께 했던 이번 주.. 만나보시죠 🥹

🥹 JPA, 넌 누구니?

레벨 2의 절반이 지나가는 시점, 이번 미션부터는 JPA가 들어왔다. 단순히 JPA만 들어오지만 결국 들어오는 건 JPA + Hibernate + Spring Data JPA였기에.. 여러 용어가 쏟아질 때 어떤 친구의 용어인지를 알아내는 것이 매우매우 중요했다. 그리고 이를 구분할 수 있을 정도가 되니, 점점 어떤 수준에서 구현되었는지, 처음부터 명세된 사항인지가 정리되기 시작했다.

JPA는 명세다. 자바에서 데이터베이스를 활용할 수 있도록 Jdbc에서 인터페이스를 제공하고, 각 벤더사가 이를 구현해 작동하는 것처럼, JPA 또한 자바에서 객체를 영속화하는 것에 대한 정의를 내려두고, 이 구현을 아래로 미루어둔 인터페이스다. 실제로 jakarta.persistence 패키지를 보자. 직접 구현된 클래스라고는 예외 클래스뿐이며, 모든 클래스가 인터페이스로 존재한다. 내부의 메서드마다 어떤 일을 해야하는지 세세히 적혀있는 건 덤이다.

JPA 하나만으로는 동작하지 않을 것을 알게 되었으니, 이제는 이를 직접 구현해줄 구현체가 필요하다. 이때 등장하는 친구가 Hibernate다. JPA에서 명시해둔 것을 구현하고, 추가로 개발자의 편의를 위해 Dirty checking 등의 기능을 추가로 구현해둔 친절한 친구.

다만 객체지향을 열심히 공부했던 입장으로, JPA의 등장이 마냥 편하다고 느껴지지는 않았다. final을 꾸준히 붙여 불변 객체에서 안전함을 느꼈던 나는, Hibernate에서 제공하는 Dirty checking, Lazy loading, Proxy를 위해 final을 제거해나가야 했다. 런타임에 불안정한 객체 상태가 존재했다. 이 과정에서 ‘정말 편한 건가? 내가 코드를 짜면서 찜찜한 상황을 최대한 배제하는 것이 편하지 않나?’ 라는 생각이 끊이지 않았다. 리뷰어에게도 이런 코멘트를 남겨 나의 감정을 공유했다.

결국 JPA를 골랐으니 이 상황에서 가장 내가 안정적이라고 느끼는 부분을 찾아나가야겠다고 생각했다. 이 가운데에서도 객체지향을 놓으면 안 되겠지 🙃 만약 JPA를 사용하지 않아도 됐다면, Spring Data Jdbc를 활용하지 않았을까? 😆

👨🏻‍💻 즐거운 페어 프로그래밍

이번 페어는 레벨 1에서 같은 조였던 시소다. 이번에도 시소의 코드로 진행해볼까 살짝 떠 봤는데, 머지되지 않았다면서 나의 코드로 진행하게 되었다..ㅎㅎ 재즈의 코드는 계보를 타고 내려가 같은 리뷰어 다른 리뷰이 코드를 계속 확인하고 있다는 풍문이…💭

JPA, Spring Data JPA가 둘 다 생소하다보니, 공식 문서를 반드시 읽어가면서 진행했다. 이번 미션에서 가장 뿌듯했던 건 개인 블로그를 방문하지 않고, 공식 아티클을 참고해 지식을 쌓아나갔다는 점이다. JPA 공식 문서, Hibernate 공식 문서를 띄워 두고 어떤 상황인지를 에러를 통해 확인한 뒤, 차곡차곡 코드를 쌓아나갔다. 기존 Jdbc 코드에서 JPA로 옮겨가는 상황이니 비즈니스 로직에서 변화는 없었다. Service Layer에서 아무 변화도 없이 Dao-Repository가 깔끔하게 변경되는 것을 보고 ‘잘 짰네’ 싶었다 ㅎㅎ

이 과정에서도 객체지향을 놓치지 않고자 노력했다. 예를 들자면 @Embedded에서의 @Column 설정이 있는데, 아래와 같은 두 가지 방법으로 테이블의 열을 설정해줄 수 있다.

// 1
@Embedded
@AttributeOverride(name = "name", column = @Column(name = "name", nullable = false))
private ThemeName name;

// 2
@Embedded
private ThemeName name;

// ThemeName.java
@Column(name = "name")
private String name;

위 방법은 하나의 엔티티 객체에서 모든 열을 확인할 수 있다는 장점이 있지만, 내부 객체의 캡슐화를 위반한다는 심각한 문제가 있다. 상위 객체에서 사용하는 하위 객체는 철저하게 보호받아야 한다. 설령 상위 객체에서 사용하더라도, 내부 필드가 노출되는 것은 캡슐화를 위반하는 형태이다. 따라서 2번과 같이, @Embedded 내부에서 @Column 설정을 해 주었다. 물론 이것도 2번과 같이 짠 근거이지, 해당 방법이 항상 Best practice라고 볼 수는 없을 듯하다. 그때그때 요구사항에 따라 유연하게.. 지금까지 해 왔듯이 말이다 😎

목요일 4시 즈음에 마무리하고, 남은 시간동안 PR을 마무리하고 페어와 헤어졌다. 이번에도 많은 것을 배워가서 고마웠다 🥹 페어 최고다 최고, 혼자 한다면 자칫 깊게 삽질할 수 있을 내용을 적절한 호흡으로 가져가고, 스트레스가 쌓여갈 즈음에는 잡담도 하고. 좋은 에너지를 잔뜩 받아갔다 🔥

🧗🏻‍♂️ 클라이밍 바람이 불어요

벽 타자 벽

초반부터 클라이밍을 다녔던 리니, 이와 함께 처음 다녀왔었던 이든과 여러 크루들이 함께 클라이밍에 참전했다 🧗🏻‍♂️ 더클 강남에 가려고 했지만 사람이 많을 것이라는 케이의 제보에 따라 온사이트로 변경되었는데, 케이가 온사이트에 있었던 우연이…, 🔥 가서 같이 이런저런 문제를 해결했다.

클라이밍을 하면 항상 전완근이 땅땅해져서 아팠는데, 몇 번 타 봤다고 이제는 등과 하체가 단련되는 기분이 든다. 당장 저번 탈 때만 해도 두-세번 타고 30분 쉬는 것이 기본이었는데, 이번에는 잠깐 쉬고 다시 벽에 붙는 걸 보니 힘을 쓰는 방법을 어느 정도 알게 된 듯..? 나지도 않았던 땀도 흘리고 즐겁게 타다 왔다 ㅎㅎㅎ

특히 처음 도전했던 다온과 클로버도 좋은 경험이었겠지..? 다온은 마지막에 나와 함께 못 풀었던 문제를 기어코 풀어냈는데, 너무너무 부러웠다 🥹 벽 바뀌기전에 한 번 들러야 하나… 다음 벽 탈 때가 기대된다.. ㅋㅋㅋㅋ 저렴한 취미가 아니다보니 정기권이나 횟수권을 끊을 때가 되었나.. 암벽화를 살 때가 되었나.. 고민하는 중.

😬 내가 일요일에 캠퍼스에 가다니

주말이 다가오자 브리가 백엔드 잡담방에 의미심장한 홍보 글을 올렸다.

레벨2(방탈출)와 관련있지만 미션과는 관련없는 딴 짓.. 누가 봐도 재밌을 듯한 활동이었다. 주말에 공부하러 나오는 건 질색이지만 논다니까 일단 함께하기로 하고, 점심 먹고 캠퍼스로 향했다.

보기만 해도 시끄럽다

어떤 것을 기대하고 왔냐는 말에 방탈출이니 보물찾기니 각양각색의 추측이 난무했지만, 우리 앞에 떨어진 건 개발이었다(?), 스프링 프레임워크가 아닌 다른 익숙하지 않은 프레임워크를 활용해 미션 초반부를 구현해내라는 지령이다. 주어진 시간은 두 시간. 마치 레벨 1의 첫 수업때의 문자열 계산기를 만드는 것처럼, 일단 구현해야겠다는 생각이 먼저 들었다.

나는 파이썬과 어느 정도 친했기에, 다른 프레임워크 중에서도 FastAPI를 쓰면 재밌지 않을까? 싶어서 레디와 함께 페어 프로그래밍을 진행했다. 후일담인데, 어느새 크루들이 옹기종기 짝을 찾아 서로 코드를 확인해주고 있었다. 페어 프로그래밍에서의 좋은 경험이 몸을 먼저 움직이게 했던 것 아닐까 ㅎㅎㅎㅎ…

FastAPI는 누군가에게 여러 번 좋다는 이야기를 듣고 실제로 개발해본 적은 없었는데, 공식 문서도 한글화돼 있고, 다양한 곳에서 예시를 찾아볼 수 있었던 데다가 ORM까지 지원해서 너무 편하게 구현했다. 프레임워크 이름처럼 진짜 빠르게 개발도 진행됐다. Hello World부터 Static html load까지 15분 남짓 걸렸던 듯..! 파일도 컴팩트하게 10개도 되지 않는데다 내부 함수들도 짧아서 직관적이었다.

구현을 다 하고 보니 다른 크루들은 NestJS, Spark, Express, Flask 등 여러 프레임워크로 구현해주었다. 뒷부분은 몰라도 사용자 입장에서는 같은 페이지를 마주한다는게 어떻게 보면 참 쓸쓸했다. (백엔드는 누가 알아주나)

바닥부터 헤딩하는 방법을 다들 알게 된 것일까, 다들 공식 문서를 참고했다고 한다. 공식 문서가 불친절해서 ChatGPT를 활용한 팀도 있고, 블로그를 찾아본 팀들도 있었다. 레벨 2의 학습 목표 중 하나인 ‘본인만의 학습 방법을 찾는다’에는 정말 알맞은 방법이라고 생각했다. 코치분들이 이를 의도했다고 하니, 정말 성공적인 활동이라고 본다 🧐

마무리한 뒤에는 피자파티가 있었다 🍕, 두 시간동안 함께해 준 레디 고생 많았어 🤜🏻

잘 먹었습니다 😋

⭐️ 이번 주는요

미션이 시작되는 주는 항상 순식간에 지나간다. 페어의 의견을 듣는 시간, 코드를 짜는 시간은 정말 지나가는 줄도 모른다. 이번 주는 그 와중에도 어떤 키워드를 학습했는지를 잘 기록해둬서 다행이라고 생각하고 있다. 며칠동안 디버깅의 늪에 빠진 적도 있었는데, 알고 보니 진짜 디버거가 잘못했다는 결론이 난 일도 있었고, JPA/Hibernate/Spring Data JPA의 차이를 잘 공부해보기도 하고.

다음 주부터는 혼자 3-4단계를 구현하면서 진행할 텐데, 꽤나 난관이 예상된다. 아직 JPA-객체지향 사이의 간극을 좁히지 못한 터라 여기서 오는 불안을 어떻게 해소할지를 먼저 생각해봐야겠다.

날이 점점 더워진다. 저번 주까지만 해도 하루 덥고 하루 춥고 이랬는데, 주말이 될 수록 여름이 다가옴을 느낀다. 여름 싫다.., ☃️ 차라리 비 오는 게 기분이라도 좋으니 장마라도 기다려야겠다 🌧️

(재즈 블로그 오픈 기원 3주차)

Categories