게시글
질문&답변
추상화 레벨
1. 주석을 사용하지 않는 코드가 '진짜 클린 코드'다?'클린 코드는 는 주석을 사용하지 않는다'라는 표현도 심심치 않게 보는 것 같아요. 그런데 뭐든 극단적으로 하면 장점보다 단점이 많다고 생각해요.물론 인지비용을 줄이기 위해서 '읽기 좋은 코드'를 작성해야 한다는 점은 동의합니다. 그래도 필요에 따라 팀의 인지비용을 줄이는 방법이 주석이라면 저는 주석도 괜찮다고 생각해요. (이단)결국, 중요한 점은 '어떻게 인지비용을 줄일 수 있을까?'를 고민해야 한다고 생각합니다. 2. 코드스멜이 나지 않아요.(... 저도 마찬가지지만) 게임 강화 '천장 시스템'처럼 의식적으로 비용을 투자하는 방법밖에 없다고 생각합니다! (혹시 좋은 방법 있으면 공유 좀 부탁드려요) 경험 없는 1인의 지나가며 작성합니다... 🙂↕
- 0
- 3
- 291
질문&답변
sql 단축키
Reformat Code 기능을 찾으시는 것 같습니다.Mac: CmdOpt LWindow: Ctrl Alt LSQL 외에도 코드정리 시 사용가능합니다.
- 0
- 2
- 246
질문&답변
[해결완료!!] Error: Something went wrong installing the "sharp" module
같은 문제를 겪었습니다. 답변 공유해 주셔서 감사합니다.
- 2
- 2
- 4.4K
블로그
전체 72024. 10. 27.
1
[인프런 워밍업 스터디 클럽] 2기 - 마지막 발자국
누군가에는 길기도, 짧기도 했던 워밍업 클럽 일정이 종료됐다.*물론 완주까지 '수료식'이라는 태산 같은 축제가 기다리고 있다. 이전 3주 차까지는 테스트를 작성하는 자세와 기본 개념에 대해 배웠다면, 이번 주는 '테스트를 그래서 어떻게 사용하면 좋을까?' 고민하고 의견 나누는 시간을 가졌다. 강의섹션 6. Spring & JPA 기반 테스트: 어떤 생각, 의도를 가지고 테스트를 작성하면 좋을까?섹션 7. Mock을 마주하는 자세: 그래서 Mock 좋아하세요...?섹션 8. 더 나은 테스트를 작성하기 위한 구체적 조언: 음성을 듣고 지식공유자의 의도를 추론하라.섹션 9. Appendix: 묻고 따지지 않고 바로 적용하여 생산성 올리기섹션 10. Outro: 잊지마세요. 당신의 초심과 철학 실습이 많았던 강의였던 만큼 호흡이 길었다. 그런데 마침 컨디션 관리도 실패했다. 감기에 걸려 곤혹을 치뤘다.'완주러너 못할 수도 있겠다'라는 불안, 당혹감도 찾아왔다. 컨디션이 좋아졌을 때 '계왕권'을 사용했다. 결국 모든 조건을 만족했다. 미션Layered Architecture는 왜 그럴까?Mock을 마주합니다. 그런데 Test Fixture를 곁들인색다른 방법으로 해결했다. 이전에는 '강의를 듣고 나서 생각을 정리한다'라는 관점을 가졌다. 하지만 이번 주는 '우선 해결한다'라는 방법을 적용했다. 출제자의 의도를 먼저 분석했다. 다시 한번 '오늘부터 내 꿈은 너야' 대사를 외치며 마법을 사용했다. 오랜 시간을 사용하지 않고 간단한 프로토 타입을 만든다는 생각으로 임했다. 결국 빠르게 문제를 해결할 수 있었다. 그런데 문제 해결보다 더욱 좋았던 점은 사고 확장이다. 우빈 님께서 생각하시는 의견과 내가 알아내 지식과 무엇이 다른지 생각하고, 정리할 수 있었다. 조금 더 능동적으로 사고했다고 생각한다.(물론 이번 주 미션이 코드에 의도를 담는 작성 미션이 아닌 정리 미션인 덕분에 빠르게 해결한 것 같다는 생각도 있다) 정리하면 '예습 후 복습'이라는 학창 시절을 회상하는 원론적인 방법을 적용했다. 적용하고 나니 상황에 따라 적절한 방법이라고 생각한다. 이전에는 '미션에 너무 많은 자원을 사용하고 있지 않나?' 의문도 들었는데 이번에는 빠르게 해결하고 퀄리티를 보충해서 '완벽의 함정'에서 탈출할 수 있었다. 개발은 아니지만 '애자일'과 관련 있다고 생각한다. 자신감을 얻어 종종 사용할 것 같다. 마치며이번 주 가졌던 생각을 허심탄회하게 풀어내니 시원섭섭하다. 워밍업 클럽과 함께 벌써 보냈을 뿐인데 올해도 60일정도 남았다. 마지막 남은 진짜 진짜 최종 일정 '수료식'까지 잘 마치면 좋겠다. 1기와 2기를 보낸 러너의 후기는 '장태근블로그'에거 계속된다. 인프런 워밍업 클럽 스터디 - BE 클린 코드 & 테스트 과정
백엔드
・
인프런워밍업클럽
2024. 10. 20.
1
[인프런 워밍업 스터디 클럽] 2기 - 세 번째 발자국
드디어 테스트 과정이 시작됐다. 3주 차, 무엇을 고민했을까? 강의테스트 강의를 들으며 집중했던 부분은 '어떻게 사용할까?'에 대해 고민했다.과정은 Java & Spring으로 과정이 진행된다. 하지만 현재 나의 환경(다른 언어, 프레임워크)에서고민하면 좋을 것 같은 내용 위주로 정리했다.예) 어떻게 데이터베이스에 데이터를 미리 넣어둘 수 있을까? (seed) 미션코드를 작성하는 마지막 미션, Day 12가 주어졌다. 단위 테스트를 작성하며 혼돈에 빠졌다.'간단하지 않을까?'로 내심 생각했던 부분들이 전부 어려웠다. 특히 '어떤 부분을 테스트해야 할까?' 가려내는 작업이 어려웠다. 덜어냄의 미학그럼에도, 문제를 해결하기 위해 고민했다. 요구사항이 '목표'라고 생각하고 목표를 달성하기 위해 필요한 메서드를 선별했다. 무엇을 추가해야 할까, 보다 무엇을 덜어내야 할까에 집중한 것 같다. 예외 케이스를 신경 쓰지 못해서 아쉽다. 마치며앞서 강의에서 언급했던 것처럼, 추가 사고과정을 거치니 이전보다 복잡했다. 하지만 혼돈, 고난을 극복할 때 재미도 함께 느꼈다.시간 정말 빠르다. 한 주 남았다. 끝까지 정신 줄 부여잡고 함께 이겨내면 좋겠다. 인프런 워밍업 클럽 스터디 - BE 클린 코드 & 테스트 과정
백엔드
・
인프런워밍업클럽
2024. 10. 13.
1
[인프런 워밍업 스터디 클럽] 2기 - 두 번째 발자국
시간 가는 줄 모른다. 벌써 워밍업 클럽 2주 차가 끝났다. 강의지난주에 개념을 잡았다면, 이번 주는 실습이 많았다. 2가지를 중점으로 들었다.어떻게 활용할 수 있을까?사고를 어떻게 하실까?실습을 하다 보니, 부족한 점을 많이 느꼈다. 객체지향이 부족하다고 느꼈는데 역시 맞았다. 개념도 중요하지만 어떻게 사용해야 할지 이어지지 않았다. 잠시 풀이 죽었다. 그런데 다시 생각해 보니 기회였다.'섹션 7. 리팩토링 연습'이 가장 인상 깊다. 준비한 개념을 전부 활용하는 섹션이었다. 섹션 7을 막힘없이 설명할 수 있다면 강의를 제대로 수강했다고 생각한다. 섹션 7에 계시는 우빈 님께 여러 번 인사드릴 예정이다. 늘 그랬듯, 해결할 것이다. 미션미션 1개였지만 어려웠다. '막막하다'라는 표현이 적절하다. 도저히 '객체지향'에 다가갈 수 없었다. 다른 분의 방식을 참고해서 미션을 해결할 수 있었다. 하지만 '내가 무엇을 모르고 부족한가?'를 알아보기 위해서는 알고 있는 부분에서 최선으로 해결했다.만족스럽지 않았다. 아쉬웠다. 문제에 부딪혔을 때 지식 공유자 님을 추상화하고 다가가려고 시도하는 편이다. '섹션 8. 기억하면 좋은 조언들'에 도움을 많이 받았다. 우빈 님께서 어떻게 사고에 다가갈 수 있는지 상세하게 이야기해 주셔서 힘을 얻었다. 지금도 재밌는데, '의도를 전달할 수 있다면 얼마나 재밌을까?'라는 생각이 들었다. 적용하기 어려웠던 부분을 반복해서 체득시킬 생각이다. 마치며클린 코드 과정이 끝났다. 중간 점검에서 우빈 님께서 하신 말씀이 기억에 남았다."강의에 전하고 싶은 내용을 모두 담았습니다"앞으로 이어지는 테스트에서도 어떻게 실천하고 계신지 함께 지켜보며 들을 생각이다. 절반 왔다. 강의에서 끝나지 않고 연습이 중요하다고 느꼈다. 3주 차도 무리 없이 헤쳐나갔으면 좋겠다. 인프런 워밍업 클럽 스터디 - BE 클린 코드 & 테스트 과정
백엔드
・
인프런워밍업클럽
2024. 10. 06.
1
[인프런 워밍업 스터디 클럽] 2기 - 첫 번째 발자국
드디어 인프런 워밍업 클럽 2기가 시작됐다. 사실, 수강 신청 전까지 끝까지 의심했다. 진짜 하고 싶은 일이 맞을까? 수강 신청이 열리는 순간부터 셔터 문 닫을 때까지, 약 2주 동안 고민하다 결국 신청했다. '시도하지 않으면 후회할꺼야'라는 마음의 소리를 이길 수 없었다. 강의수강 추상화를 주제로 이야기를 풀어간다. 추상화 덕분에 일상을 돌아봤다. 모든 것이 추상화다. 추상화되어있지 않은 사물이 바로 떠오르지 않는다. 발자국을 작성하도록 도와주는 노트북도 그렇다. 일정한 리듬에 맞춰 키보드를 두들기는데 글자가 모여 글이 된다. '추상화가 없다면 01001과 같은 숫자로 글을 작성하고 있지 않았을까?'라는 생각이 들었다. 추상화는 '친절'이라고 생각한다. 코드에 추상화를 더하는 전과정이 친절하지 않으면 불가능하다. 읽는 사람이 어떻게 조금 더 쉽게 읽을 수 있을까?를 고민하는 과정이 흥미롭다. 동작하는 코드 위에 의도를 전달하기 위해 친절을 베푼다. 코드, 글, 한편의 작품이 '쉽다'라는 이야기를 들으면 좋겠다. 한 순간에 가질 수 없다고 생각한다. 절반도 되지 않았지만, 객체 지향은 여러번 연습하지 않으면 익힐 수 없다는 느낌을 강하게 받았다. 체화되면 어떻게 코드가 보일지 기대된다. 미션객체 지향을 다루기 전, 미션은 비교적 간단했다. 아래 2가지를 중점으로 생각했다. 어떻게 해야 메시지를 전달할 수 있을까?미션의 의도가 무엇일까? 1기 백엔드 미션을 자주 돌아본다. 미션에서 나누고 싶은 이야기가 '자주 다루는 핵심'이라는 인상을 받았다. 과정이 3개월이 더 지났는데 배울 때마다 새롭다. 2기도 똑같은 출제자, 우빈 님의 의도가 무엇일지 생각했다. 도출한 결론은 '추상화'다. '만약 강의 내용을 주제로 대화를 나눠요'라는 미션이 주어졌을 때 추상화가 금지어라면 어떨까? 주어진 시간이 지옥이라고 느낄 것 같다. 다음 미션은 '객체 지향으로 추상화'를 어떻게 적용할 것인지 고민하는 시간을 가진다. 부족하다고 느꼈는데 잘됐다. 특히 다른 러너의 의견을 접하고 나누고 싶다. 자세한 내용은 블로그에 기록했다. 마치며어떤 행동을 시작할 때 항상 초심을 글로 작성한다. 작성한 글을 보며 '오늘 하루 최선이었나? 묻는다. 그런데 최선을 다하지 않았다. 왜 그랬을까? 시스템이 아니다. 4주라는 기간을 유지하려면 '리듬'이 중요하다고 생각한다. 그런데 자주 미뤘다. 난이도가 어렵다고 느껴지면 미뤘다. 숨을 고르는 건 좋다. 항상 전속력으로 달릴 수 없다. 하지만 학습을 이어가는 전환 속도가 느렸다. 그래도 어떻게든 계획된 진도를 마쳤다. 원하는 결과는 아니어서 아쉽지만 덕분에 다음 주 어떻게 지내야 할지 처절하게 느꼈다. 리듬을 찾자. 고통스럽다는 건, 적절한 난이도라는 증거다. 쉬우면 공부가 아니다. 고통을 극복했을 때 펼쳐지는 그림을 상상해 보자. 다음 주, 발자국에 어떻게 남길지 기대된다. 인프런 워밍업 클럽 스터디 - BE 클린 코드 & 테스트 과정
백엔드
・
인프런워밍업클럽
2024. 05. 19.
0
[인프런 워밍업 스터디 클럽] 1기 - 세 번째 발자국
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]3주 차는 이전까지 만들었던 애플리케이션을 배포하는 과정을 다뤘다. 무엇을 배웠나?11일 차: 기본적인 배포를 위한 준비- 배포란 무엇인가, 어떤 준비가 필요한가 - 스프링 서버 실행 시 설정을 코드 변경 없이 제어하는 방법 - Git, GitHub 차이, 기초적인 사용법 - AWS EC2란 무엇인가? 어떻게 사용하는가? 12일 차: AWS와 EC2 배포- EC2에 접속하는 방법과 리눅스 명령어 다루기 - 개발환경 구축 및 배포 - foreground, background의 차이 및 background 제어하기 - 도메인 이름 사용하기 13일 차: Spring Boot 설정, 버전업 이해하기 14일 차: 마무리 및 추가 꿀팁 영상 과제스프링 컨테이너와 계층화 아키텍처과일가게 API 구현하기 마무리지난주에는 걱정이 많았는데 이번주는 재밌게 보냈다. 과제를 구현하고 부족한 내용을 다시 보충하며 알아가는 과정에 시간이 사라졌다. 걱정이 많았는데 마무리가 즐겁게 끝나서 다행이다. 공식적인 스터디 일정은 이제 수료식만 남았다. 미니프로젝트를 계속 구현할지 혹은 또 다른 일정을 시작할지 생각해 봐야겠다.
백엔드
・
인프런워밍업클럽
2024. 05. 12.
0
[인프런 워밍업 스터디 클럽] 1기 - 두 번째 발자국
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]2주 차는 이론보다 실습이 많았다. 그리고 이전보다 조금 더 깊은 주제를 다뤘다. 한 번에 이해가 가지 않는 주제들도 많아서 여러 번 반복해서 보고 있다. 트랜잭션 스크립트패턴과 도메인 모델패턴을 사용해 봤던 게 가장 인상 깊었다. 무엇을 배웠나? 6일 차: 스프링 컨테이너의 의미와 사용 방법스프링 컨테이너- 서버가 시작되면 컨테이너가 생기고 스프링 빈이 들어간다. - 컨테이너는 무엇이고, 스프링 빈은 무엇일까? - 컨테이너는 클래스의 정보(스프링 빈)를 담고 있다. - 빈으로 등록된 클래스의 연관관계를 정리해 준다. - 스프링빈으로 등록될 때 인스턴스화를 진행한다. - 스프링빈은 두 가지의 타입을 가진다. 1. 의존성을 추가하여 등록되는 빈 2. 사용자가 직접 추가하는 빈 - 빈으로 등록되지 않은 클래스를 의존하려 할 때 컨테이너에 조회되지 않고 빈으로 등록하라고 에러가 발생한다. - 그렇다면 왜 스프링 컨테이너와, 빈을 사용해야 할까? `new` 키워드를 사용해서 직접 인스턴스화하면 되지 않을까?IoC, DI- 스프링 컨테이너를 이해하기 위해서는 3단 변화를 직접 느껴야 함 - class -> interface -> 스프링 컨테이너(IoC, DI) - IoC(제어의 역전)는 객체의 생성, 삭제등 관리를 내가 직접 하지 않고 프레임워크(컨테이너)에게 위임함 - DI(의존성 주입)는 의존성을 직접 주입하지 않고 컨테이너가 주입함 - 같은 타입의 빈이 등록되어 있을 때 컨테이너도 어떤 빈을 주입해야 하는지 교통정리를 해줄 수 없음, 이때는 사용자가 빈의 우선권을 등록해줘야 함(@Primary) - 결국 컨테이너를 사용하는 이유는 변화에 유연하게 대응하기 위해서임, 클래스를 사용하는 코드에는 변화를 주지 않고 변화가 필요한 구현코드에만 수정함빈을 어떻게 등록하고, 주입할까?- 컨테이너에 등록되는 빈을 등록하기 위해서는 `@Configuration`과 `@Bean`을 이해해야 함 - `@Configuration`은 클래스에 사용하고 `@Bean`은 메서드에 사용함 - 일반적으로 사용자가 직접 만든 클래스는 Controller, Service, Repository 어노테이션을 사용함. - 외부 라이브러리, 프레임워크에서 제공하는 클래스를 빈으로 등록할 때 두 어노테이션을 조합하여 사용함 - `@Component`는 컨트롤러, 서비스, 리포지토리 외에 추가 클래스를 스프링 빈으로 등록할 때 사용함 - 빈을 주입시키는 방법은 3가지가 있음(생성자, setter, 필드) - 생성자 주입이 가장 권장되는 방식임(불변, null 체크) - setter 주입은 setter 메서드를 열어둠으로써 누군가 사용하여 오염될 수 있음 - 필드 주입의 경우 `@Autowired`를 사용하는데 테스트 코드 작성시 어려움 - @Qualifier: 같은 타입의 빈을 구별하는데 사용함 - @Primary: 우선권을 지정할 때 사용 - @Qualifier 는 사용하는 쪽과 등록하는 쪽 모두에서 사용해 연결할 수 있음 - @Qualifier와 @Primary가 동시에 사용될 경우 Qualifier가 우선권을 가짐 - 스프링은 사용자가 직접 지정한 설정을 우선으로 함 7일 차: Spring Data JPA를 사용한 데이터베이스 조작문자열 SQL을 직접 사용할 때 문제점과 JPA- 문자열을 직접 사용하는 것은 실수(오탈자)가 발생할 확률이 높음. 에러가 컴파일 시점에 발견되지 않고 런타임 시점에 발견되는 치명적인 문제(운영 중 발견) - 프로그래밍 언어와 관계형 데이터베이스의 패러다임 불일치 - 반복적인 작업 발생(CRUD) - 변화에 유연한 프로그램 구현이 어려움: 특정 데이터베이스에 종속됨 - JPA(Java Persistence API)는 자바진영의 ORM 기술 표준을 의미함: 데이터를 영구적으로 보관하기 위한 규칙 - 영속성(Persistence)은 영구적인 속성 - 규칙(Interface)을 구현하기 위해 Hibernate(구현체)를 사용 - Hibernate는 내부적으로 JDBC를 사용함Entity Class 만들기- Entity는 관리되어야 할 데이터를 의미함 - 기존 클래스를 엔티티로 선언하기 위해서는 `@Entity`를 사용 - id를 기본키로 만들어 주기 위해서는 `@Id`를 사용 - `@GeneratedValue` 해서 기본키 생성전략을 제공해야 함 - JPA를 사용하기 위해서는 기본 생성자가 제공되어야 함 이때 `protected`로 선언 - `@Column`은 테이블과 매칭, 다양한 옵션을 선언할 수 있음. nullable, length, name... - JPA를 사용하기 위해서는 설정에 추가해야 함 - `ddl-auto`: 서버가 시작될 때 테이블을 어떻게 처리할 것인지를 정함 - `hibernate.show_sql`: 데이터베이스에 날리는 SQL을 보여줌 - `hibernate.format_sql`: 포맷팅 해서 보기 좋게 보여줌 - `hibernate.dialect`: SQL 방언을 JPA가 수정해 줌Spring Data JPA 사용하기- JPA를 편리하게 사용할 수 있도록 Spring에서는 Spring Data JPA를 지원함 - Spring Data JPA -> JPA -> Hibernate -> JDBC - save: 객체를 저장하거나 업데이트 - findAll: 일치하는 모든 데이터 조회 - findById: id를 기준으로 일치하는 데이터 1개 조회 - Spring Data JPA를 사용하면 다양한 쿼리를 조합할 수 있음 - find, findAll, count, 등등...8일 차: 트랜잭션과 영속성 컨텍스트- 트랜잭션이(Transaction)이란 더 이상 쪼갤 수 없는 업무의 최소단위를 의미함 - 트랜잭션을 시작하면 모두 성공(commit)하거나 되돌리기(rollback)할 수 있음 - 트랜잭션을 적용할 때 `@Transactional`을 사용함 - 영속성 컨텍스트가 핵심 9일 차: 조금 더 복잡한 기능을 API로 구성하기API 스펙을 설계하고 직접 구현하는 것을 권장 10일 차: 객체지향과 JPA 연관관계이전에 구현된 코드는 객체가 협력하지 않고 직접 객체를 가져다 쓰는 방식으로 작성되었음. 어떻게 하면 객체가 서로 협력하는 관계를 맺어줄 수 있을까? > ![비즈니스 로직구현 Entity VS Service](https://www.inflearn.com/questions/117315/%EB%B9%84%EC%A7%80%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EA%B5%AC%ED%98%84-entity-vs-service) - 서비스에 작성된 비즈니스 로직을 도메인 계층으로 이동시킴 과제과일가게 API 구현하기클린코드 이해하기 마무리우려하던 일은 현실이 돼버렸다. 컨디션 관리에 실패했다. 궁금한 주제를 탐구하기도 하고 딴짓을 하다 늦게 잠들었다. 수면패턴이 꼬이고 생산성도 저하됐다. 결국 시간을 알차게 보내지 못했다. 과제를 해결하는데 급급하기도 했고, 진도표를 몰아서 듣기도 했다. 연쇄반응으로 걱정도 늘어났다. 불행 중 다행으로 긍정적인 사실도 찾을 수 있었다. 잠(루틴)의 중요성을 느꼈다. 푹 자고 일어나서 루틴을 다시 시작하니 금방 제모습으로 돌아왔다. 이외에도 다양한 주제를 탐구하다 보니 견문이 넓어졌다. 시간을 효율적으로 보내고 얼른 접하고 싶은 욕심이 든다.
백엔드
・
인프런워밍업클럽