본문 바로가기

전체 글45

테스트 코드가 없다면? 개발을 공부할 때부터 테스트 코드에 대한 중요성이 만연하게 퍼진 상태라서 테스트가 1개도 없는 레거시 코드는 본 적이 있지만 테스트 코드를 작성하지 않는 프로젝트를 진행해 본 적은 없습니다. 테스트를 작성하지 않으면 어떻게 될지 간단하면서도 직관적으로 표현해주는 이미지가 있어 가져왔습니다. 많은 의미로 해석될 수 있지만 저는 테스트를 작성하지 않는다면 현재 유지 보수 및 기능 추가를 위해 추가/삭제한 코드가 어떤 영향도를 가지고 있는지 파악할 수 없다라고 해석했습니다. 물론 테스트를 작성하는 것이 쉬운 길은 아닙니다. 때로는 너무 쉬운 코드에 대해 테스트 코드를 작성하여 배보다는 배꼽이 더 큰 것이 아닌가 라는 생각이 들지만 아무리 간단한 기능이라도 추후에 다른 누군가가 수정하게 된다면 기존 의도를 파악.. 2024. 1. 11.
Yes man이 되지 말자 지난 1년 간 백엔드 직무를 맡으면서 수많은 요구사항을 구현했지만 모든 요구사항을 구현 중에 사용자의 필요성을 고려한 것은 아니어도 어떻게 하면 사용성을 개선하고, 조금 더 편하게 기능을 사용할 수 있을지 고민을 많이 했습니다. 이렇게 일을 하면서 요구사항 구현이 확정된 상태에서 사용성을 고민하는 것은 습관이 되었는데. 최근 몇가지 문의 사항을 구현하다 보면서 돌아보니 정말 필요한 기능인지 고민하는 습관이 잘 들지 않았다는 생각이 들었습니다. 진행 중인 프로젝트 등 외부 요인을 모두 제거한 이상적인 요구사항 분석 및 구현은 아래와 같습니다. (외부 요인을 최대한으로 제거했기 때문에 실무와 맞지 않는 상황이 있을 수 있습니다) 기능 구현 문의가 들어온다. 정말 필요한 기능인지 분석한다. (다른 팀의 협업은.. 2024. 1. 9.
plain Jar 파일이 생성되지 않도록 하자 spring boot 프로젝트를 구성하고 build를 실행하면 아래와 같이 2개의 jar 파일이 생성되는 것을 알 수 있습니다. *-SNAPSHOT.jar *-SNAPSHOT-plain.jar 두 개의 jar파일 중 plain이 포함된 것을 `일반` jar 파일이라고 부르고, 포함되지 않은 것을 `실행 가능한` jar파일이라고 부릅니다. (경우에 따라 다르게 부를 수 있습니다) `일반` jar 파일: 일반 jar 파일은 라이브러리 형태의 Java 애플리케이션을 패키징 하기 위해 사용되는 것으로 다른 애플리케이션에서 라이브러리로 사용될 수 있도록 클래스와 리소스만을 포함됩니다. 즉, 애플리케이션을 실행하기 위한 모든 의존성과 실행 환경을 포함하지 않기 때문에 독립적으로 실행이 불가합니다. `실행 가능한` .. 2024. 1. 8.
grid area를 사용하여 menu, header, content 영역 분리하기 grid area는 다음 첨부 사진처럼 menu, header, content, footer 등을 나누고 싶은 경우 사용할 수 있습니다. 위처럼 영역을 나누는 것은 css를 사용하여 간단하게 구현이 가능합니다. 다음은 css 코드입니다. .container { display: grid; grid-template-columns: 160px 1fr; /* sidemenu 너비와 나머지 공간 */ grid-template-rows: 80px 1fr; /* header 높이와 나머지 공간 */ grid-template-areas: "header header" "sidemenu content"; height: 100vh; } .header { grid-area: header; } .sidemenu { grid-a.. 2024. 1. 7.
git 브랜치 전략 톺아보기 git, gihub, gitlab, trunk based development 브랜치 전략에 대해 간략하게 소개하도록 하겠습니다. 각 전략의 장/단점을 파악하여 프로젝트 성격에 맞게 적용해 보면 좋을 것 같습니다. Git Flow Git Flow는 Vincent Driessen이 제안한 모델로, 기능 개발, 릴리스 준비, 유지보수, 핫픽스 등을 관리하기 위해 여러 종류의 브랜치를 사용합니다. 주요 브랜치는 master, develop, feature, release, hotfix입니다. master: 안정적인 릴리스 버전을 관리합니다. develop: 다음 릴리스를 위한 개발 작업이 진행됩니다. feature: 새로운 기능 개발을 위한 브랜치입니다. release: 릴리스 준비를 위한 브랜치입니다. ho.. 2024. 1. 4.
github actions와 React를 사용하여 pages에 배포 github actions, react, pages를 사용하여 cicd 파이프라인을 구축하기 위해서는 아래 항목을 수행해야 합니다. .github.io 리포지토리 생성 react, typescript 프로젝트 생성 github actions 작성 node 설치는 생략하고 진행하도록 하겠습니다. (node download) .github.io 리포지토리 생성 빨간 박스로 표시된 New 버튼을 눌러줍니다. 위 캡처에 표시된 순서대로 입력을 해줍니다. 이때 Repository name에 본인의 username이 들어갈 수 있도록 유의합니다. 로컬 PC에 github project를 복사하기 위해 Https URL을 복사해 줍니다. git clone 위 명령어를 로컬 디렉터리에 입력하면 생성한 github 프로.. 2024. 1. 1.
RuntimeException이 왜 기본 롤백인지 RuntimeException과 Error가 spring boot에서 org.springframework.boot:spring-boot-starter-data-jpa를 사용할 때 기본 롤백 설정인 것을 어렵지 않게 알 수 있습니다. spring boot에서 RuntimeException과 Error가 왜 기본 롤백으로 설정되어 있는지 Transaction 어노테이션의 noRollbackFor, RollbackFor 옵션을 넣어주는 것이 어떻게 롤백 여부를 결정할 수 있는 것인지 알아보도록 하겠습니다. 아래와 같은 순서로 글을 작성해 보겠습니다. RuntimeException, Error가 왜 기본 롤백인지 rollbackFor, noRollbackFor 값을 설정하면 어떻게 롤백 여부를 결정하는가? Ro.. 2023. 12. 21.
autoprefixer: start value has mixed support, consider using flex-start instead just release it 프로젝트 코드 구현을 하면서 github actions에 배포를 하는데. 항상 그렇듯 로컬에서는 문제가 없지만 액션이 실패했습니다. 예외 메시지가 친절하게 나와 있어서 해결에는 어려움이 없지만 autoprefixer가 하는 역할에 대해서 조사를 해봤습니다. autoprefixer는 css를 브라우저 간 호환성을 높이기 위해 자동으로 조정해주는 도구로 display: flex를 사용할 때 사용되는 aligh-items, justify-content가 브라우저 호환이 좋지 못할 때 warning 메시지를 내보내줍니다. 예를 들어 아래와 같은 css 코드가 있다고 할 때 .container { display: flex; align-items: start; /* 이 부분이 문제를 일.. 2023. 12. 17.
Router, Menu component 생성하기 2023. 12. 17.
github actions는 ㄱr끔 대소문ㅈr를 구분ㅎr지 못한ㄷr. github actions가 분명히 있는 Header 컴포넌트를 찾지 못해 액션이 실패했습니다. 로컬에서는 npm run build가 문제없이 성공했기 때문에 이유를 쉽게 찾을 수 없었는데요. 그러다가 stackoverflow에서 다음 글을 찾게 되었습니다. (stackoverflow 1줄 요약 github config에 의해 가끔 디렉터리 이름 변경을 감지하지 못할 수 있다.) 글을 읽고 로컬에 저장된 디렉터리 이름과 원격 저장소에 저장된 디렉터리 이름을 확인해 봤더니 다르게 저장되어 있었습니다. 문제 해결을 위해서는 로컬과 원격 저장소에 저장된 디렉토리 이름을 동기화 주어야합니다. 다음 과정을 모두 수행해주면 해결할 수 있습니다. git config.ignoreCase false 명령어 입력 변경 내.. 2023. 12. 16.
코틀린 일급 컬렉션은 멋지지 일급 컬렉션은 하나의 컬렉션만 wrapping 하고, 그 외 다른 멤버 변수가 없는 클래스를 의미합니다. 일급 컬렉션은 비즈니스 로직을 캡슐화하여 관리하고, 불변성을 보장하여 데이터의 안정성을 향상합니다. 개념적인 부분은 위와 같고, 예시 코드를 살펴보겠습니다. // value는 1~13 값 저장, pattern은 스페이드, 클로버, 하트, 다이아몬드 저장 data class Card(val value: Value, val pattern: Pattern) 위와 같은 data class가 정의되어 있다고 할 때 // 일급 컬렉션 미적용 var deck: MutableList = mutableListOf() // 일급 컬렉션 적용 data class Deck( private val cards: Mutable.. 2023. 12. 14.
[Release it] localhost 벗어나기 직접 개발한 프로젝트를 배포하여 public 세상에서 사용 가능하도록 합니다. 기술 스택은 다음과 같습니다. 백엔드: spring boot, kotlin, jpa, querydsl, 데이터베이스: mysql, mariadb, postgresql 중 택 1 프론트엔드: react, typescript 프로젝트의 목적은 처음 개발을 시작하는 분들이 localhost 세상에 빠져있지 않고, 실제로 서비스를 배포해보면서 주변 지인들에게 서비스를 자랑하고, 사용해볼 수 있게 하고, 피드백을 받을 수 있도록 하는 것입니다. 순서는 아래와 같이 구성될 예정입니다. (기간이 길고, 순서는 따라갈 것이지만 그때 그때 상황에 따라 하고 싶은 것을 먼저할 수 있습니다) github actions와 React를 사용하여 pa.. 2023. 12. 12.