돌아보면, 그때는 그게 이상적인 개발자였다 내가 처음 개발을 배울 때만 해도, 이상적인 개발자는 명확했다. “돌아가기만 하는 코드”가 아니라 “깔끔하게 잘 짜여진 코드”를 쓰는 사람. 변수명 하나, 클래스의 책임 하나에도 철저하게 의미를 두고, 디자인 패턴을 익히며 “더 나은 구조”를 고민하던 사람이 멋있어 보였다. 나도 그런 개발자가 되고 싶었다. 그런데 어느 순간, 일이 달라졌다 요즘 나는 예전보다 훨씬 덜 ‘코드를 짠다’. AI에게 요구사항을 자세히 설명하고 나면, 잠시 다른 업무를 보거나 회의를 하거나 커피를 마시고 돌아오는 사이 코드가 완성되어 있다. 나는 그 코드를 검토하고, 프로젝트 컨벤션에 맞게 정리하거나 개선 방향을 제시한다. 이건 더 이상 “코드를 작성하는 일”이라기보다 “AI와 함께 ..
요즘 진행하고 있는 개인 프로젝트에서는 아래와 같이 구조를 가지고 있다.- Word: 학습할 단어- WordGroup: 학습할 단어 묶음- Category: WordGroup을 꾸미는 카테고리(태그)데이터는 다음과 같았다.- 그룹1 - 단어 2개(full, stuffed) - 카테고리 2개(여행, 일상)- 그룹2 - 단어 3개(happy, joyful, cheerful) - 카테고리 1개(여행)홈화면에서 실행되는 /main API는 사용자의 닉네임, 아직 학습하지 않은 단어그룹 최대 5개(카테고리 포함), 전체 카테고리를 반환해야 한다. 이때 아래와 같이 쿼리가 실행된다.# 닉네임 반환을 위한 사용자 정보 조회Hibernate: select m1_0.id,m1_0.created_at,m1_0.email,..
우연히 양자기술 컨퍼런스인 를 알게 되어 사전등록 후 다녀왔다. KAIST, IBM, KT, 메가존 클라우드, LG 등 정말 많은 곳들이 전시부스를 채우고 있었다. 말이 많았던 아이온큐. 성균관대의 양자컴퓨터도 보고. 양자컴퓨터를 보며 이해가 안 갔던 부분들에 대해서는 챗지피티와 이야기를 나누며 이해하는 시간도 가졌다. 더더욱 양자컴퓨터에 대해 관심이 생겼다. 사실 더더욱 이곳에 가야겠다고 생각했던 이유인 김상욱 교수님의 강연. 대중강연이라 그렇게 어려운 내용을 다루시진 않고 양자컴퓨터의 이야기를 주로 해주셨는데, 원래 '중첩'과 '얽힘'에 대해 알고 있기도 했고, 컴퓨터의 구조에 대해서는 잘 알고 있으니 이해하기 어렵지 않았다. 그런데 내가 그런 내용을 알고 있는 걸 차치하고 들어도 교수님은 일반인들이..
요즘 개발하고 있는 서비스는 다른 앱에 웹뷰 형태로 제공되는 서비스이다. 그래서 아무래도 기술적인 제약이 있는 편인데, 이번엔 스트리밍 형태의 STT에 대한 요구사항이 들어와서 기술조사 차원에서 구현해보았다. 안드로이드 기준으로 작성하긴 했지만 아이폰에서 사파리로 실행했을 때도 문제없이 STT가 동작했다. 웹뷰에서 마이크를 사용하기 위해선 우선 앱에서 웹뷰가 마이크를 사용할 수 있도록 권한을 허용해줘야 한다.(아래는 안드로이드 기준 설정. iOS라면 그에 맞는 별도의 설정이 필요) // 앱이 오디오 출력이나 오디오 경로, 볼륨 등을 조작하고 싶을 때 필요 만약 위 두 권한을 설정하지 않으면 NotReadableError: Could not start audio source 를 만날 수 있다.// 앱이 마..
앱스토어에서 실적이 저조한 앱을 아예 내리려는데, '현재 앱을 삭제할 수 없습니다.'라고 떴다. 삭제가 불가능한 경우는 아래와 같다.연관된 인앱 구매 항목이 존재판매중인 앱아래 상태의 앱Ready for Review (심사 준비됨)In Review (심사 중)Rejected (거절됨)Metadata Rejected (메타데이터 거절됨)Waiting for Review (심사 대기 중)다른 계정으로 이관 중인 앱앱 번들에 포함된 앱 나의 경우, 무료앱에 이미 배포가 완료된 상태였고, 다른 계정으로 이관이 진행중이라거나 앱 번들에 포함되지 않은 앱이었다. 그런데 앱을 삭제할 수 없었던 이유는 무료앱이더라도 가격은 0원으로 설정되었기 때문이다. 위와 같이 [가격 및 사용 가능 여부]로 이동해서 화면 제일 하단..
리액트 훅(Hook)함수형 컴포넌트에서 상태 관리나 라이프사이클 기능 등을 사용할 수 있게 해주는 React의 기능함수형 컴포넌트: 그냥 JavaScript 함수. props를 받아서 JSX을 리턴.자주 쓰는 기본 훅useState: 상태 관리 할 수 있게 해줌useEffect: 컴포넌트가 렌더링될 때, 혹은 특정 값이 변경될 때 실행되는 코드 작성useRef: DOM을 직접 참조하거나, 렌더링과 상관없는 값을 저장할 때 사용useMemo, useCallback: 컴포넌트가 불필요하게 다시 계산되거나 함수를 새로 생성하지 않게 최적화할 때 사용useReducer를 사용해서 로직을 컴포넌트로부터 분리하는 건 요즘 많이 쓰는 패턴 중 하나리액트 훅은 이름 앞에 항상 use를 붙임StateuseState로 S..
이번에 준비중인 서비스에서는 서비스 이용 보상으로 스탬프를 준다. 그런데, 그 스탬프 획득 조건이 여러 가지이다. 연속 학습을 했을 때 주는 스탬프도 있고, 특정 날짜에 들어왔을 때 주는 스탬프도 있고. 스탬프 기능을 구현하면서 이걸 JPA로 구현할 때 어떻게 하면 좀 더 객체지향적으로 할 수 있을지 고민했다. 이런식으로 서비스 이용 보상이 주어지는 경우는 많으니까 다른 분들은 어떻게 하실지 모르겠지만, 나는 아래와 같이 했다. 우선 스탬프 획득 조건이 크게 세 종류라고 생각하고 진행했다.CountCondition: 어떤 행동을 일정 횟수하면 주어지는 조건TimeRangeCondition: 어떤 기간동안 어떤 행동을 하면 주어지는 조건DateRange: 어떤 날짜에 어떤 행동을 하면 주어지는 조건 획득 ..
개발을 하다보면 매번 아무 것도 없는 상태에서 시작하는 게 버거운 순간이 온다. 그럴 때 필요한 건 바로 템플릿! 나도 몇 개 앱을 개발해보니 생각보다 따로 설정하기 귀찮은 부분이 있어 미리 설정을 다 해놓은 템플릿만 있으면 비즈니스 로직만 갈아끼우면 되니 편하겠다는 생각이 들었고, 그래서 오늘은 iCloud 동기화 기능이 담긴 Template Repository를 만들었다. 우선 XCode에서 사용할 수 있는 Project template 형태로 생성할까 했는데, 생성은 했는데 프로젝트를 생성할 때 팀 정보 입력하는 화면에서 안 넘어가는 이슈가 있었다. 그래서 아예 프로젝트덩어리째 템플릿화하는 방법을 생각했다. 깃허브에서 Template Repository 만들기 평소와 똑같이 깃허브에서 Reposit..