본문 바로가기
320x100
320x100

마지막까지 KPT 회고 프레임워크를 선택해서 작성해보려고 한다!

Keep(만족, 지속하고 싶은 부분)

수강 목록

마지막 4주차는 개인프로젝트는 잠시 stop하고 강의와 관련된 부분을 이어 나갔다.

Kotlin, Springboot, MySQL, JPA, Docker/compose, Thymeleaf, Bootstrap으로 개발하고 GCP에 Docker로 배포하고 Domain을 구입하고, certbot nginx로 인증서를 발급받아서 https까지 적용했다.

2주 쫌 안되게 걸렸는데, 신기했던 부분이 몇 가지 있었다.

 

첫번째, 코틀린은 언어의 특성으로 인해 주 생성자 부분에 인자를 나열하는 스타일, 주 생성자에는 파라미터만 받고 { } 본문에 val/var등을 붙여 프로퍼티를 만드는 방식, 주 생성자에는 최소한의 인자를 받고 부 생성자로 처리하는 스타일, 주 생성자의 호출을 private으로 막고 정적 팩토리 메서드 패턴을 사용하는 방식 등 다양한 스타일이 나올 수 있는데 지식공유자님은 이 중 어떤 하나의 스타일을 선호하셨다..!! ㅎ

내가 말한 것들을 예로 들면 아래와 같은 코드이다.

// 스타일 1: 주 생성자 부분에 인자를 나열하는 스타일
class Person1(val name: String, val age: Int)

// 스타일 2: 주 생성자에는 파라미터만 받고, 본문에서 프로퍼티를 생성하는 방식
class Person2(name: String, age: Int) {
    val name = name
    var age = age
}

// 스타일 3: 주 생성자에 최소한의 인자를 받고, 부 생성자로 처리하는 스타일
class Person3(val name: String) {
    var age: Int = 0

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }
}

// 스타일 4: 주 생성자의 호출을 private으로 막고, 정적 팩토리 메서드 패턴을 사용하는 방식
class Person4 private constructor(val name: String, val age: Int) {
    companion object {
        fun create(name: String, age: Int): Person4 {
            return Person4(name, age)
        }
    }
}

참고로 프로퍼티(주생성자에 붙이던, 클래스 바디부분에 붙이던)에 private을 붙인다면 딱 생성자에만 사용할 수 있고 어떠한 getter나 setter로 인한 조작을 제공받을 수 없게된다(코틀린을 써본 사람이 있다면 이걸로 검증할 수 있을 것 같다ㅎㅎ)

 

두번째, 테스트코드의 클래스 최상단에는 DisplayName을 명시하지 않고 테스트함수(메서드)에만 붙여왔었는데, 강의에서는 최상단의 클래스에도 붙이니 depth가 생겨서 읽기 좋았다.

 

세번째, 실제 쿼리를 처리하는 JPA또는 CRUD Repository들은 domain 레이어에 두고, 이 repository들을 따로 모아서 presentation/repository 패키지에서 PresentationRepository로 사용하신 부분이었다. 일종의 Facade로 사용하신 것 같은데 강의에서는 처음 봤다. 

그리고 이와 관련해서 Spring에는 Repository로 메타데이터를 표시하면(어노테이션), 그 내부에서 호출하는 예외를 DataAccessException으로 Wrapping해준다. 그래서 계속 @Repository를 사용 안하시길래 의아했었는데, Presentation Layer쪽에서 여러 레포지토리들을 사용하는 부분에서 마킹해준걸 보고 오호~! 했다.

 

네번째, 나는 회사에서 application-{환경}-example.yaml 형태는 github에 올리고 example이 안붙은거는 gitignore에 추가하는 방식으로 사용한다던지.. 아니면 아예 application관련 파일들은 다 gitignore에 추가하고 AWS, GCP 등의 터미널에서 복사해와서 사용한다던지, 외부 환경변수도 그냥 export를 사용한 linux방식으로 외부에서 주입한다던지 요런 방법들만 써왔었고 다른 사람들의 프로젝트에서 우연히 jasypt(JAva Simplified encrYPTion)을 사용한 걸 보긴 했는데 이번 강의에서 처음 써봐서 신기했다. 하지만 현재 프로젝트를 시간이 지나서 관리를 안한다던가, 과거의 것이 되어버린다면 plainPW를 까먹을수도 있으니 어딘가에 기억을 해두고 관리를 해야한다는 점은 있었다.

 

마지막으로, 거의 끝에 Docker로 빌드하고 Docker-Compose로 사용하는 부분에서 CLI보다는 UI 위주로 알려주는게 좋았다. 개인적으로 나는 docker buildx build --platform linux/amd64,linux/arm64 -t ... 를 사용하는 CLI 방식을 썼었는데 강의에서는 builx를 사용하는 것은 아니었지만, IntelliJ의 UI를 사용하는.. 정확히는 Run Configuration의 IntelliJ Docker 관련 기능을 사용하는 것이 신기했다. 도커 빌드가 실행되기전에 gradle task 2개를 추가하고, 태그를 붙이고 build option을 리눅스에서 돌아가는 환경으로 쫙 쓸 수 있는게 좋았다.

나도 전회사에서 프론트엔드분이 도커나 shell script에 대해서 모르셨는데.. 음 WebStorm인가 IntelliJ를 쓰셨는데.. 프론트가 켜지기 전에(npm) 쉘스크립트와 도커컴포즈가 실행되게 Before launch에 Task를 추가해서 프론트엔드분은 프론트 개발에만 치중할 수 있게 셋업해드린 경험이 있었는데 도커로는 처음 써봐서 좋았다.

그리고 Docker나 Docker Compose나 Docker Desktop으로 보여줘서 좋았다. 개인적으로는 CLI도 정말 잘써야하지만 그것을 잘 쓸 수 있게 해주는 UI 툴도 잘 사용할 줄 알아야 좀 더 손이 빠른 개발자가 된다고 생각한다. 물론 git/github CLI도 모르면서 UI로만 잘하면 좀 가오떨어지긴하니깐 둘 다 쓸 줄 알아야한다고도 생각한다.

UI
UI를 사용한 빌드

 

결국 완성한 귀여운 프로젝트 ㅎㅎ 궁금하신 분들은 https://boki-dev.com/로 접속하면 볼 수 있다.

 

Boki's Portfolio

저는 주도적으로 문제를 찾고, 해결하는 꼬부기입니다. 기술을 위한 기술이 아닌, 비즈니스 문제를 풀기 위한 기술을 추구합니다. 혼자가 아닌 팀원들과 함께, 최고가 아닌 최선의 방법을 찾아

boki-dev.com

메인 화면

Problem(부족, 아쉬웠던 부분)

목요일에 어머니가 병원에 입원하셔서 다음날인 금요일에 수술하셨고, 쭉 어머니를 돌보느라 2차 중간 점검 라이브때 참여를 못했다 ㅠㅠ.

강의에서 아쉬웠던 부분은.. 음 많은 데이터를 추가한 테이블에서 Pagination이 필요한 경우에는 fetch join으로만으로는 해결이 안될텐데 JPA를 사용하면서 그 부분에 대해서도 있으면 좋았을 것 같다.

그 외에는 지식공유자님의 첫 강의였던만큼 부족한 부분이 조금씩은 누구나 있을 것이라고 생각한다.

 

그리고 나는 약간 젊꼰(젊은꼰대)에 속해서 Backend 영역 즉, Spring을 깊게 공부하고 싶은 사람이라면(내 생각)

1. CS & Java Language(언어 학습)

2. Java Application Project(프로젝트 실습) - 순수 Java프로젝트, JDBC정도

3. JVM, GC 공부

4. Spring(프레임워크 학습)

5. Spring boot(프레임워크 학습2)

6. Springboot Project(프로젝트 실습)

7. Kotlin(언어 학습)

8. Kotlin/Springboot Project(최종)

이렇게 가야지 자신의 실력이나 깊이에 대해서 좌절 또는 현타가 좀 덜 오는 현업에서 부족함 없는 실력자 될 수 있지 않을까 생각하는데..

얕게 알고 취업하면 언젠가는 자신의 개발실력에 헌타가 오기도 하고 그러더라..

주위에서 보기도 했고 나도 조금은 겪었었다(나도 알고싶지 않았다).

 

근데 이렇게 말하면 꼰대소리 들으며 왜 코프링(코틀린스프링)부터 시작하면 안되냐고 반문할 지도 모르겠다..ㅎㅎ

 

Try(도전할 부분)

강의를 보고 만든 프로젝트는 완성했으니, 기존의 내 개인 프로젝트로 돌아가서 계속 살과 뼈를 붙여가며 완성해보고 싶다.

백엔드도 첨에 사이즈를 크게 잡아서.. Redis도 RedisTemplate, Spring Annotation 방식(@Cacheable..), Repository(@RedisHash) 방식들 차이에 대해서 알아보고 더 잘 사용하고, Kotlin에 좀 더 친화적인 Kotlin JDSL도 사용해보고 활성유저의 트래킹이나, 매니저->작업자의 Task 할당에 MQ를 사용한다던지 기능추가를 하며 고도화를 해보고 싶다.

프론트쪽은 현업에서 Angular/Vue를 주로 썼었는데, React/Ts 강의도 들어서 프론트엔드 부분은 CRA로 만들 것이다.

320x100

댓글