블로그

망고123

인프런 워밍업 클럽 스터디(BE) 0기 / 3주차 발자국

일주일 간의 학습 내용에 대한 간단한 회고📕어느덧 마지막 3주차 회고 작성입니다. 인프런 워밍업 클럽 스터디 0기(BE)에 참여하면서, 어설프게 할 생각이었다면 시작조차 안 하는 것이 백배 낫다고 생각하며 진정성 있는 참여를 하기 위해 미션과 미니 프로젝트를 수행하기 위해 최선을 다하려고 끊임없는 도전과 열정을 코드로 보이기 위해 노력했습니다. 3주의 시간이 정말 짧게 느껴질 정도로, 수많은 고민과 반복적인 공부를 통해 스스로의 객관화를 가질 수 있는 매우 유익한 시간이라고 확신합니다.🔥미니 프로젝트 4단계까지 구현을 성공했습니다. 비록💡한 걸음 더! 는 마감 기간 내에 구현하지 못했지만, 처음 시작할 때의 열정과 목표를 잊지 않으면서 강의를 통해 멘토님께서 전달하고자 하는 지혜와 경험을 바탕으로 3주 동안 스스로 많이 성장한 모습에 놀라며 끊임없는 도전으로 구현 능력의 한계를 극복할 수 있게 된 특별한 경험이었습니다. 이 경험으로 취업에 성공하여 회사에 의미를 더해줄 훌륭한 개발자로 성장을 목표로 오늘도 어김없이 정진하겠습니다.일주일 동안 스스로 칭찬하고 싶은 점 미니 프로젝트를 진행하면서 정말 많은 고민을 통해 구현한 코드는 매우 의미가 있습니다. 4단계까지 무사히 마칠 수 있는 스스로에게, 한계를 넘어 벽에 부딪히는 것에 두려워하지 말고 한계를 도달하고 뛰어 넘을 수 있다는 가능성을 눈 앞에서 증명했다는 것에 감사하다고 전하고 싶습니다.아쉬웠던 점 회사 이력서를 작성하면서 4단계 💡한 걸음 더! 배포를 기간 내에 마치지 못한 것에 많은 아쉬움을 갖고 있지만, 이 또한 나의 부족함과 나태함의 결과로 승복하였습니다. 하루라도 더, 몇 시간이라도 더, 조금만 더 잠을 안자고 했더라면 충분히 할 수 있었음에도 불구하고 못한 자신에게 아쉬움을 표합니다.보완하고 싶은 점 아무리 코드를 따라 치고, 강의를 보더라도 스스로 고민을 하고 아무것도 없는 상황에서 해결하지 못한다면 의미가 없다는 것을 크게 느꼈습니다. 단기 기억 공간과 다른 모든 인지 기억에 마치 잘 알고 있다는 착각에 빠지지 않고, 철을 관철하는 정신으로 공부한 모든 내용을 체득할 것입니다.다음주에는 어떤 식으로 학습하겠다는 스스로의 목표 강의 PDF, PPT 를 통해 처음부터 끝까지 다시 복습을 진행하며, 백엔드 개발 관련 책을 구매하여 함께 병행할 예정입니다. 소중한 경험을 소홀히 하지 않고 앞으로의 부족함을 채우는 행보에 지치고 힘들며 한계에 부딪히는 순간들을 맞이하고 뛰어 넘기를 목표합니다. 학습 내용 정리미니 프로젝트 1단계API 에 따라 정상적인 동작을 수행하는지 과정을 검증하는 공간입니다. 직원과 팀 엔티티 확인하기 #4 직원과 팀의 컨트롤러, 서비스, 리포지토리 확인하기 #6커밋 메세지와 코드 확인은 위의 이슈로 이동하면 확인할 수 있습니다.0. 데이터 API팀 등록하기POST / /api/v1/team[{  "name" : "여신관리팀"}] 모든 팀 조회하기GET / /api/v1/team[  {      "name": "여신관리팀",      "manager": "김민수",      "memberCount": 2  },  {      "name": "영업1팀",      "manager": "박현준",      "memberCount": 2  },  {      "name": "전산팀",      "manager": "박준우",      "memberCount": 1  }] 직원 등록하기POST / /api/v1/members[{  "name" : "김사원",  "role" : "MEMBER",  "birthday" : "1999-11-02",  "workStartDate" : "2023-11-01",}] [{  "name" : "김사원",  "teamName" : "여신관리팀", // 직원 등록 시점에 팀 등록을 할 수 있습니다.  "role" : "MEMBER",  "birthday" : "1999-11-02",  "workStartDate" : "2023-11-01",}] 모든 직원 조회하기GET / /api/v1/members[  {      "name": "김민수",      "teamName": "여신관리팀",      "role": "MANAGER",      "birthday": "1970-11-11",      "workStartDate": "2010-02-23"  },  {      "name": "이민혁",      "teamName": "여신관리팀",      "role": "MEMBER",      "birthday": "1984-06-12",      "workStartDate": "2017-08-11"  },  {      "name": "박현준",      "teamName": "영업1팀",      "role": "MANAGER",      "birthday": "1980-09-29",      "workStartDate": "2012-02-13"  },  {      "name": "이현민",      "teamName": "영업1팀",      "role": "MEMBER",      "birthday": "1990-11-15",      "workStartDate": "2017-08-26"  },  {      "name": "박준우",      "teamName": "전산팀",      "role": "MANAGER",      "birthday": "1994-03-15",      "workStartDate": "2019-02-05"  },  {      "name": "서포터",      "teamName": null, // 팀에 포함되지 않은 직원은 null 표시합니다.      "role": "MEMBER",      "birthday": "2001-11-12",      "workStartDate": "2024-03-04"  }] 1. 테이블 생성직원과 팀 테이블은 다음과 같은 쿼리를 통해 자동으로 생성됩니다.팀 테이블직원 테이블2. 데이터 추가팀 테이블에 여신관리팀, 영업1팀, 전산팀 을 등록합니다. 직원 테이블에 다수의 직원 데이터를 등록합니다.2.1 팀 등록하기팀 등록(POST / /api/v1/team)을 통해 여신관리팀, 영업1팀, 전산팀 데이터를 팀 테이블에 저장합니다.팀 테이블여신관리팀, 영업1팀, 전산팀 데이터를 성공적으로 저장한 것을 확인합니다.2.2 직원 등록하기직원 등록(POST / /api/v1/members)을 통해 다수의 직원들을 등록합니다.직원 테이블team_id 를 통해 해당 팀에 알맞게 데이터를 성공적으로 저장합니다. 팀에 속하지 못한 경우에는 null 으로 표시됩니다.팀 테이블회원 등록과 함께 직원이 팀에 포함되면 member_count 를 증가합니다. manager 는 회원 등록 role의 MANAGER 만 가능합니다. 이미 MANAGER 가 존재하는 팀에다가 MANAGER 인 직원을 포함하려고 하면 예외가 발생합니다.3. 데이터 조회3.1 직원 조회모든 직원 조회(GET / /api/v1/members)으로 정보를 출력합니다. 팀에 속하지 못한 직원은 teamName 이 null 으로 출력됩니다.3.2 팀 조회모든 팀을 조회합니다.미니 프로젝트 2단계0. 데이터 API출근 / POST / http://localhost:8080/api/v1/commute/start?memberId=1퇴근 / POST / http://localhost:8080/api/v1/commute/end?memberId=1특정 직원의 날짜별 근무시간 조회 / GET / http://localhost:8080/api/v1/commute?id=1&date=2024-03{  "detail": [      {          "date": "2024-03-05",          "workingMinutes": 12      },      {          "date": "2024-03-04",          "workingMinutes": 600      },      {          "date": "2024-03-03",          "workingMinutes": 583      },      {          "date": "2024-03-02",          "workingMinutes": 987      }  ],  "sum": 2182} 1.테이블 미리보기출퇴근 동작 확인을 위해 미리 팀과 직원 데이터를 작성합니다.팀 테이블직원 테이블출퇴근 테이블2. 출근하기-http://localhost:8080/api/v1/commute/start?memberId=1 으로 id 가 1인 회원이 출근 처리됩니다.그림 첨부는 없지만, 회원 id 가 2, 3, 4 또한 출근으로 등록한 상태라는 점을 참고합니다.출퇴근 테이블출근에 성공한 직원은 출퇴근 테이블에 다음 그림과 같이 저장됩니다.3. 퇴근하기-http://localhost:8080/api/v1/commute/end?memberId=1 으로 id 가 1인 회원이 퇴근 처리됩니다.그림 첨부는 없지만, 회원 id 가 2, 3, 4 또한 퇴근으로 등록한 상태라는 점을 참고합니다.출퇴근 테이블퇴근에 성공한 직원은 출퇴근 테이블에 다음 그림과 같이 저장됩니다.4. id=1 직원에게 2024-03 근무한 데이터 추가하기id 가 1, 2, 3, 4 인 직원은 모두 2024-03에 한 번은 출퇴근한 상태입니다.비교를 위해 id 가 1 인 직원에게 2024-03 에 해당하는 날짜에 출퇴근 기록 데이터를 INSERT 쿼리를 수행하여 출력 데이터를 준비합니다.출퇴근 테이블5. id=1 직원의 2024-03 출퇴근 조회하기GET / http://localhost:8080/api/v1/commute?id=1&date=2024-03정상적으로 특정 직원의 날짜별 근무 시간을 조회하는 기능 을 확인할 수 있습니다.미니 프로젝트 3단계0. 데이터 API휴가 등록 / POST / /api/v1/vacation{  "id" : 2,  "date" : "2024-03-23"} 남은 휴가 개수/ GET/ /api/v1/vacation?id=114 팀마다 며칠 뒤에 휴가 등록이 가능한 일 입력 / POST / /api/v1/vacation/role{"name" : "여신관리팀","minDay" : 3 // 오늘 기준으로 몇 일 뒤에 휴가 등록 가능한 지 숫자 입력} 특정 직원의 날짜별 근무시간 조회 / GET / /api/v1/commute?id=2&date=2024-03{"detail": [{"date": "2024-03-01","workingMinutes": 670,"usingDayOff": false},{"date": "2024-03-02","workingMinutes": 720,"usingDayOff": false},... // 03 ~ 08 일 생략{"date": "2024-03-09","workingMinutes": 0,"usingDayOff": true},... // 10 ~ 30 일 생략{"date": "2024-03-31","workingMinutes": 0,"usingDayOff": false}],"sum": 1390} 1.테이블 미리보기휴가 동작 확인을 위해 데이터를 작성합니다. 참고하기 바랍니다.직원 테이블팀 테이블출퇴근 테이블휴가 테이블휴가룰 테이블1. 휴가 정책팀마다 며칠 뒤에 휴가 등록이 가능한 일 입력 / POST / /api/v1/vacation/role팀에 휴가 정책을 지정합니다. 휴가룰 테이블에서 확인이 가능합니다.휴가룰 테이블2. 휴가 등록id 가 1 인 직원에게 2024-03-10 에 휴가를 등록합니다.minDay의 3 휴가 정책에 따라서 만약 2024-03-08 이하로 입력하거나 중복된 휴가는 등록되지 않습니다.휴가 테이블3. 남은 휴가 개수남은 휴가 개수/ GET/ /api/v1/vacation?id=1남은 휴가 갯수를 숫자로 반환합니다.직원 번호 1 은 휴가 13 개를 정상적으로 반환하고 휴가를 모두 사용한 직원 번호 2는 휴가 0 개를 반환합니다.4. 특정 직원의 날짜별 근무시간 조회특정 직원의 날짜별 근무시간 조회 / GET / /api/v1/commute?id=2&date=2024-03해당 월의 모든 날짜를 휴가 유무와 출퇴근에 따라서 정상적으로 출력합니다.미니 프로젝트 4단계0. 데이터 API초과 근무 계산 / GET / /api/v1/overtime[{"id": 1,"name": "연**1","overtimeMinutes": 11100},{"id": 2,"name": "연**2","overtimeMinutes": 0}] 1.테이블 미리보기초과 근무 계산 동작 확인을 위해 데이터를 작성합니다. 참고하기 바랍니다.직원 테이블팀 테이블출퇴근 테이블2. 초과 근무 계산공공 데이터 포털로 대한민국의 공휴일과 대통령령의 대체 공휴일을 가져옵니다.요청한 년-월의 토요일, 일요일 과 공휴일 그리고 휴가일 따라서 전체 근무 일자가 몇 일인지 구합니다.요구 사항에 따라 하루 기준 8시간으로 한 달동안 법적 근로 시간을 산출하여 초과 근무 시간을 계산하여 출력합니다.그림과 같이 포스트맨의 "id" = 1의 경우 다음과 같습니다.2024-03 의 공휴일과 주말은 총 11 일입니다. 따라서 88시간 = 5280분2024-03 의 전체 평일은 총 20 일입니다. 따라서 20일 * 8시간 = 160시간 = 9600분2024-03 의 직원 (id = 1) 의 전체 근무 시간은 345 시간입니다. 따라서 345시간 * 60분 = 20,700분포스트맨의 결과 동일하게 초과 근무 시간 = 20,700 - 9600 = 11000 으로 정상적으로 출력되는 것을 확인할 수 있습니다.2024-03 의 직원 (id = 2) 는 초과 근무 시간 이 없으므로 0 으로 출력됩니다.이름은 첫 글자와 마지막 글자를 제외한 모든 글자는 * 으로 표시합니다.직원 테이블로부터 이름을 조회한 것으로 데이터베이스 안에는 정확한 이름이 존재합니다. * 는 서비스 로직에서 처리되어 연**1 처럼 응답합니다.

백엔드SpringJava

이양구

[인프런 워밍업 클럽 FE 0기] 미션8 - 디즈니 플러스 앱

🎞 Disney Plus APP GitHub 🎞 Disney Plus APP DemoRecord by ScreenToGif  개요인프런 워밍업 클럽 FE 0기의 여덟 번째 미션인 '디즈니 플러스 앱' 입니다. 따라하며 배우는 리액트 섹션 4~5(리액트로 Netflix 앱 만들기) 목표swiper 라이브러리 커스텀해보기react-oauth/google 로 구글 로그인 연동해보기 구현swiper 라이브러리 커스텀해보기// LoginPage import "swiper/css/effect-fade"; <Swiper modules={[Autoplay, EffectFade, Pagination, A11y]} autoplay={auto} effect={"fade"} pagination={{ clickable: true, }} loop={true} fadeEffect={{ crossFade: true }} slidesPerView={1} speed={2000} > {...} </Swiper> // Row.tsx import "swiper/css/mousewheel"; <Swiper modules={[Navigation, Pagination, Scrollbar, A11y, Mousewheel]} navigation pagination={{ clickable: true }} mousewheel speed={1000} spaceBetween={10} > {...} </Swiper> 2024년 3월 10일의 디즈니 플러스 메인 페이지를 그대로 옮겨보고자 swiper 라이브러리를 커스텀해봤다.로그인 페이지에서는 좌우로 넘기는 슬라이드가 아닌 fade-in-out의 슬라이드를 구현하기 위해 swiper에 EffectFade 모듈을 추가하고 fadeEffect 속성을 추가했다.이 fadeEffect가 제대로 작동하기 위해선 반드시 해당 이펙트의 css를 추가해야 한다.다른 모듈이나 컴포넌트를 추가할 때처럼 자동으로 추가되지 않으니 주의해야 한다. (이걸 몰라서 한참을 찾았다. 😥)Row 컴포넌트는 마우스 휠에 따라 움직이는 슬라이드를 만들기 위해 Mousewheel 모듈과 속성을 이용했다.이렇게 슬라이드 속성을 정한 뒤에 swiper가 렌더링하는 요소의 class를 찾아 CSS에서 원하는 디자인으로 변경하면 된다.이때 라이브러리의 CSS와 겹치는 속성이 있을 수 있기 떄문에 '!important'를 붙이는 게 좋다. react-oauth/google 로 구글 로그인 연동해보기// index.js <GoogleOAuthProvider clientId={process.env.REACT_APP_CLIENT_ID}> <BrowserRouter> <App /> </BrowserRouter> </GoogleOAuthProvider> // App.jsx const navigate = useNavigate(); const [isLogin, setIsLogin] = useState( localStorage.getItem("user") ? true : false ); useEffect(() => { isLogin ? navigate("/") : navigate("/login"); }, [isLogin]); <Routes> {isLogin ? ( <Route path="/" element={<Layout setIsLogin={setIsLogin} />}> <Route index element={<MainPage />} /> <Route path=":movieId" element={<DetailPage />} /> <Route path="search" element={<SearchPage />} /> </Route> ) : ( <Route path="login" element={<LoginPage setIsLogin={setIsLogin} />} /> )} </Routes> react-oauth/google는 구글 로그인을 지원하는 라이브러리로, 사전에 구글의 Cloud에서 API 등록을 하고 Client ID를 발급받아야 사용할 수 있다.먼저 프로젝트의 최상위에 GoogleOAuthProvider로 감싸준다.그리고 사용자의 로그인 여부에 따라 페이지를 이동시키기 위해 라우터를 설정한 App 컴포넌트에서 관련 코드를 작성했다.페이지가 렌더링 될 때 로컬 스토리지에 저장된 유저 정보를 받아오고 만약 없다면 로그인 페이지로 보내도록 했다. // loginPage const googleLogin = async (credentialResponse) => { localStorage.setItem( "user", JSON.stringify(jwtDecode(credentialResponse.credential)) ); setIsLogin(true); }; <GoogleLogin onSuccess={(credentialResponse) => googleLogin(credentialResponse)} /> GoogleLogin 컴포넌트는 react-oauth/google 라이브러리에서 지원하는 버튼 컴포넌트로 디자인 및 로그인 관련 함수가 내장되어 있다.onSuccess는 사용자의 로그인이 성공했을 때 실행되는 콜백 함수이며, 인자로 로그인한 유저의 정보를 담은 데이터를 갖는다.여기서 credential이라는 값은 유저의 정보를 담고 있는 토큰으로 암호화되어 있기 때문에 jwt-decode 라이브러리를 이용해 디코딩하여 사용해야 한다.여기서 받은 picture는 사용자의 프로필 이미지 링크를 포함하고 있어서 Nav 컴포넌트에서 사용해 로그인한 유저의 프로필 이미지로 변경했다. 회고'Netflix 앱 만들기'를 하면서 사용했던 기술이 대부분이라 오래 걸리지 않을 것 같았지만...라이브러리 알아보고 문서 읽고 실행해보고... 하는 데 너무 오래 걸린 것 같다.배너 하단의 카테고리 부분은 이전에 같은 과제를 하셨던 분의 깃허브를 참고했다. (https://github.com/kimneighbor/clone-disney-plus-app)로그인 페이지는 따라하기 싫어서 현재 디즈니 플러스 홈페이지를 보고 참고했다.그대로 하면 얼마 안 걸릴 거라 생각했는데 생각보다 라이브러리 커스텀에서 좀 애를 먹었다. 😅with_networks: "2739" 2739는 TMDB에서 디즈니 플러스 방송사(networks) 코드라서 axios의 instance 기본 값에 추가했다.몇몇 요청은 해당 파라미터가 통하지 않거나 오류를 보내기도 해서 완벽하진 않다.디즈니 플러스에서 API를 제공했다면 더 알맞게 페이지를 구현할 수 있었을 텐데 하는 아쉬움이 남는다.한편 영화 정보 API를 제공해주는 TMDB(The Movie Database) 같은 곳이 있어 감사하고 다행이라는 생각이 들었다.프론트엔드 공부하는데 API를 제공해주는 곳이 아예 없었다면 혹은 매번 일정 비용을 지불해야 했다면 얼마나 힘들었을까로그인도 사실 좀 더 좋은 라우팅 구조나 상태 관리 라이브러리를 공부하고 사용해보고 싶었지만...계속 욕심만 커지는 것 같아 최대한 간단하게 구현하려 했다.(사실 과제 밀려서 조바심에 아무것도 못 했다... 😂) 

프론트엔드워밍업워밍업클럽프론트엔드프론트FE미션과제발자국

신영우

[인프런 워밍업 스터디 클럽 1기 디자인] 2주차 발자국 (신영우)

학습 내용복습을 위해 이번 주에 필기한 강의 내용을 갈무리했습니다프로퍼티의 종류들Text 프로퍼티 → 디폴트 텍스트 설정instance swap → 변경할 수 있는 에셋 설정이때 Value 에서 디폴트 에셋 설정 가능Preferred values에서 변경할 수 있는 에셋들 설정 가능프로퍼티의 위치를 바꿔주는 것도 중요Leading icon 의 Boolean 프로퍼티 아래 → Leading icon 의 instance swap 프로퍼티를 위치시켜 디자인 시스템 사용성을 증진시키는 구성을 만들어 줌에셋의 높이를 통일시켜주는 것도 중요모 컴포넌트에 min, max 하이트 값을 넣어주면 자 컴포넌트에도 적용 볼드님 질의 응답 답변Storke가 살이있는 아이콘은 Union을 먼저 한 다음 Outline Stroke로 깨야함 → Storke 값이 살아있으면 리사이징 시 값이 유지 됌 (리사이징 되지 않음) 발견한 설계 꿀팁인스턴스가 조합된 최종 상태의 컴포넌트는 한번 더 묶어주기디자인 시스템 사용성 챙기기이 때 기준이 되는 모 컴포넌트는 ‘part/’ 라벨링을 붙여 검색 시 노출 안되게 해주기 ex)컴포넌트 베리언트에서 절대 위치(앱솔루트 포지션) 적용할 수 있음 그리고 절대 위치 적용한 디자인 에셋에 컨스트레인 적용해서 반응형으로 설정 가능함ex)컴포넌트 베리언트 정의한 영역 안에서 일괄 적용되지 않게 하려면 각 개별 컴포넌트 안에서 에셋을 정의하면 됌Boolean으로 적용하면 안되는 부분, 적용하지 않으려는 목적으로 작용ex)작업 이후 디자인 에셋들 Contrast 체크해서 접근성 갖추기몰랐던 점들이미지 삽입 관련이미지도 스타일 등록이 가능하니 자주 쓰는 이미지는 등록해놓으면 좋을 것 같다 이미지 삽입할 때 ‘프레임 배경 컬러 선택 → 이미지 선택’해서 넣어주는게 좋을 것 같다( 1. 이미지 자유롭게 리사이징 가능 / 2. 이미지 다른 에셋으로 곧바로 변경 가능 )오토 레이아웃 설정 관련오토 레이아웃 설정에서 스트로크 같이 면으로 처리 안되는 친구들의 ‘Included / Excluded’를 설정할 수 있다오토 레이아웃 설정에서 에셋들의 스택 순서를 ‘Last on top / First on top’으로 변경할 수 있다 미션 내용회고를 위해 이번 주에 진행한 미션 내용을 톺아봤습니다미션 #5 - 피그마 컴포넌트 기초 배우고 입력 컴포넌트 만들어보기미션 #6 - 입력 컴포넌트 나머지 만들고 마지막 점검하기미션 #7 - 디스플레이 컴포넌트 만들어보기미션 #8 - 디스플레이 컴포넌트 나머지 만들고 마지막 점검하기  이번 주 미션도 저번 주와 마찬가지로 총 4개의 미션이었다.미션 #5, #6, #7, #8 과정 모두 컴포넌트를 만드는 미션으로 UX 경험적으로 꼭 필요한 공통 에셋들을 만들어보는 과정이었다.실무에서 공통 에셋들을 만들어본 적은 있지만, 수업처럼 모든 에셋들을 만들어본 적은 없어서 본격적인 과정들이 쉽진 않았다. (생각보다 시간이 오래걸리는 점도 꽤나 힘들었다)그래도 미션 #5, #6, #7, #8 과정을 거치며 베리어블 사용하는 것에 어느정도 익숙해진 것 같다. (조금 속도가 붙었다)중간중간 적용을 까먹고 빼먹는 친구들이 종종 있는데 좀 더 꼼꼼히 살피면서 설계할 필요가 있는 것 같다.다음 주도 공통 컴포넌트 에셋을 만드는 작업을 이어서 진행한다.빨리 페이지에 만들어놓은 컴포넌트 에셋들을 적용시켜보고 싶다...!완주까지 기대가 되는 요즘이다. 굿! 스스로 칭찬하고 싶은 점 : 월요일, 화요일 매우 몰입해서 미션 #5, #6, #7, #8을 모두 완주한 점아쉬웠던 점 : 아이콘 시스템, 타이포 그래피 시스템을 다듬어야 하는데 다듬지 못한 점보완하고 싶은 점 : 타이포 그래피 시스템도 베리어블을 적용해보고 싶은 점다음주 목표 : 3주차 들어가기 전 아이콘 시스템, 타이포 그래피 시스템 다듬어야할 친구들 무조건 손보고 들어가기! 

UX/UI피그마베리어블디자인시스템

한국 IT 용어 이야기 (8) - "팀"

아마도 어릴 때 프로 스포츠들로 팀을 접해서 은연중에 아래와 같은 고정 관념들이 있어 왔다. 1) 적으면 5명, 대개 9명, 많으면 후보 포함 25명, 2) 공통의 목표가 있고, 경쟁을 해서 이겨야 할 상대방이 있음.... 3) 비슷한 규모의 다른 팀이 언제나 있음. 이후 대학교에 들어가서야 팀 프로젝트 같은 걸 접하게 되었고, 다른 단어 고민 없이 여러 가지 문맥에 상관 없이 팀이라는 단어를 접해 왔었다. 아래는 사회 생활을 하면서 접하게 된 "팀"에 대한 몇가지 이야기들..팀장과 팀원사회 생활을 하며 팀장이라는 직함을 쉽게 접하게 되었는데, 삼성전자의 경우 상무이사급 임원이 팀장으로 200명을 거느리고 있는 경우가 있었고, 자그마한 회사에서 1인 팀의 팀장이라 불리는 사람이 있기도, 혹은 3-4명 조별과제 정도 크기의 일들이 있었더랬다. 이 경우 팀장의 역할이라는 것도 스펙트럼이 넓었고, 인사권을 총괄하는 의미부터 간단한 POC 까지 다양했다. scope는 매번 눈치껏 알아서 챙겨야 했지만, 팀장의 호출 하에 한 자리에 모일 정도 되면 하나의 팀원으로 생각하는 정도...?대화 상대로서 ### 팀장이라는 사람을 만났을 때 어디까지를 기대해야 할까 ? 반대쪽의 입장에서 기대하는 정도에 따라서 난이도가 있었던 기억이고, 종종 '팀장이라는 당신 말고 책임자와 이야기하고 싶다' 라는 생각을 했던 기억이다.미국에서의 팀생각보다 광범위하게 쓰여서 다른 의미로 눈치가 필요했었다. 식당에 가면 종업원들이 팀 혹은 crew 로 불리우고 only team member allowed from here 등으로 뭐랄까 그룹지어질 수 있는 모든 규모를 다 팀으로 부르고 있었던 거 같다.회사에서 팀이 커지거나 해서 여러 계층이 필요하게 되었을 때 매번 이름을 짓는 것도 일인데, 행정적 편의로 누구누구네 팀을 그냥 불러서 쓰곤 했었다. Rajan's team, Jen's folks, Michael's guys 등등.. report line 을 통째로 들고 생각하는 모습이라 관리하는 측면에서 많은 이득이 있었다.조직도가 다른 사람들을 차출의 형식으로 모아 일하게 될 때 코드 네임 등을 유용하게 썼던 기억이다. 이전에 구글 플레이스토어 한국/일본 과제를 할 때 미국에서 일하는 한국어/일본어 능력자들을 차출한 후 "dragonball" 이라는 한일관계에 나름 중립적인 팀 이름으로 모인 적도 있었고, 그 이전에 한동안 Calypso 라는 이름으로 50명 정도의 팀이 알려진 적도 있었더랬다. 만나는 거의 모든 사람들과의 대화에 "What is Calypso?" 로 시작했어야 하지만, 나쁘지 않았고, 당시 이름이 과제의 주제와 꽤 잘 맞아서 많이들 좋아했던 기억이다. 검색, 유튜브 등과 같이 거대한 게 되지 않는다면 영원한 것은 없고, 결과적으로 과제 별로는 2-3년 정도가 적당한 life cycle 이었던 거 같다.목적 조직/기능 조직, squad, chapter, task force한국에 다시 조인하고 나서 가장 어색하게 적응했던 것이 목적 조직, squad, chapter, 등의 유사 팀의 운용에 대한 내용이다. 10년 넘게 구글에서 speed & flexibility 에서 전혀 손해를 보았다는 생각이 없는 상태여서 개인차가 물론 있을 것인데, 한국에서 대다수의 회사들이 agile, velocity 등의 명분으로 squad, chapter, silo 등의 이름으로 팀들을 다양하게 나누어 정의하고 운용하고 있음에 많이 어색해 한다.개인적인 선입견이 강하게 있다. 먼저, spotify 에서 시도했지만 실패로 기록이 남았다고 하는데, 그에 비해 너나 할 거 없이 쓰고 있는 게 이해가 잘 안 된다. 그리고 스쿼드의 형태로 운용되려면 아래 3가지 정도는 챙겨 져야 한다는 생각이다. 1) 해체를 포함한 기간을 담보한 직원들 rotation 보장, 2) 모든 직군 별 commitment level ( up to 100% ) 3) 최소한의 코드 quaitly ... 더 깊은 이야기는 케바케일 거 같으니 여기서는 이 정도만 ...당장 치루어야 할 과제를 하기 위해 어쩔 수 없이 시작했다가 여러 이유로 계속 눌러 붙어 있으면서 부작용들이 진행되는 모습들이고, 그게 특히 스타트업씬에서는 더 적나라하게 나타나는 것으로 이해한다. 코드의 경우 쓰는 사람들만 있고 지우는 사람들이 없는 모습과도 닿아 있고, 한두명이 번아웃이 났을 때 위험에 더 드러나게 되는 모습이 되기도 한다. 회사들마다 사정이 다르겠지만, 꼰대스러운 한 마디의 잔소리만 하자면, 스쿼드든 챕터든 나 말고 상대방을, 동료를 한 번 더 생각하고 거드는 모습이 더 있고, 그걸 매니지먼트에서 존중하면 조금 더 낫지 않을까 하는 생각이다.Lead, head of ###구글에 다녔을 때도 한국에서는 상대적으로 작은 규모의 팀이다 보니 중소기업에 다녔을 때처럼 명함의 직함이 조금 뻥튀기 되어 있기도 했다. 구글 내에서는 그래도 자기 직함을 쓰는 건 매니저 승인이 필요했지만, 아무래도 링크드인 출범 이후에 (살짝 과장된) 직함들이 감투로서 쓰이곤 하는 거 같다. 규모가 작은 회사일 수록 Chief , Lead , Head 등이 아무래도 자주 보이는데, 면접 과정이거나 실제 업무를 같이 해 보기 전에 판단을 해야 하는 입장에서는 난이도가 꽤 높다. 뭐 거짓말을 악의적으로 하려고까지는 아니라 생각해도...게다가 최근에 보았던 사례들은 감투를 주면 바로 퇴사를 감행하고, 그들의 이력서는 ### Lead 로 update 되어 있었다. 타사와 협상을 잘 이뤄냈다고 긍정적으로 볼 수도 있겠으나, 새로운 감투를 달았으면 그 감투를 달고 몇 명의 사람들과 어떤 일을 이루어 냈는지 등이 궁금하고 반대로는 자랑하고 싶어야 할텐데, 서로 속고 속이는 세상이 되고 있는 거 같아 조금 씁쓸하고 불안(?)하기도 하다.

교양용어한글영어

전재민

[인프런 워밍업 스터디 클럽 1기_디자인] 첫번째 발자국

첫번째 발자국지난 일주일 동안의 나의 행적과 앞으로의 목표 및 소망  4/26 OT8시에 구글 미트에 모여 피그잼으로 ot를 진행하였다.지식 공유자이자 이번 클럽의 멘토이신 볼드님의 소개로 시작된 ot는피그잼으로 다른 러너분들의 지원 동기, 매일 계획, 끝나고 자신에게 줄 선물 등다양한 생각과 다짐을 들었고, 이번 클럽의 전체적인 진행 방식과 보상에 대해 들었다.그 중 나를 가장 자극 했던건 우수 러너들에게 주어지는 보상으로,꼭 열심히 활동해서 우수 러너가 되겠다는 목표가 생기는 순간이였다.  4/29 1일차디자인 토큰과 베리어블, 그리고 디자인 시스템과 베리어블 이름에 대해 배우는 시간이였다.전문적인 지식을 처음 접하는 나에겐 하나같이 다른 나라 언어처럼 들렸다.하지만 시간을 들여 천천히 또 반복적으로 들어보니 하나 둘 씩 이해가 되기 시작했다.매번 새로운 개념을 보며 불을 발견한 원시인처럼 강의에 빠지게 시작하고 앞으로의 강의가 기대가 된다.  4/30 2일차컬러 베리어블을 등록했던 날.강의에서는 3개의 구조, primitive, theme, sematic을 위주로 설명해주었다 색상 베리어블 구조, 이름 짜보기 강의 중 캡쳐위의 사진이 내게 베리어블 구조를 가장 잘 이해하게 해준 사진이다. 처음으로 베리어블을 만들어보면서 느낀건 primitive, theme, sematic 구조를 이해하고 무슨 역할을 하는지만 알아두면기존에 쓰던 style보다 훨씬 편하고 수정도 빠르다는 것을 느꼈다. 미션은 강의를 천천히 다시 봐보며 메모하고 연습도 해보고 수정도 하는 등그 날에만 7번 정도 베리어블을 처음부터 끝가지 만들어보기도 했다. 개인적으로는 이번 일주일 동안 가장 어려웠고 가장 고생한 날인거 같았다.하지만 내가 써본적도 없는 유용한 플러그인도 많이 알아가는 시간이여서 즐거웠고뭔가 전문적인 지식이 쌓인다는 만족감이 좋았다. 아쉬운 점은 theme에서 color scoping 설정을 못했던 게 조금 아쉬웠다.내가 만든 베리어블 sematic 일부분 캡쳐  5/1 3일차타이포그래피, 아이콘, 간격 베리어블 등록 모바일, 데스크탑 등 다양한 상황에 쓰이는 폰트와 크기, 굵기 등을heding과 body로 나눠 간단하게 스타일로 정리해보았다.가장 기억에 남는건 폰트를 한번에 바꿔주는 플러그인이였다그동안 어떻게 한번에 바꿀까 고민이 많았는데 그 고민을 날려주는 플러그인이였다또 새로운 걸 배워서 좋은 경험이였다. 내가 만든 타이포그래피 중 깨지는 desktop heading 캡처항상 아이콘이 필요하면 icon8에서 하나씩 찾아왔는데다양한 아이콘 사이트를 알게 되었고 아이콘을 하나의 면 처리 작업도 해보았다.중간중간에 깨지는 빌런들 때문에 골머리를 앓았던 날이였다.그리고 아이콘이 깨지면 어떻게 해야되는지 질문 드렸는데 너무 친절하게 답변해주셨다!내가 만든 아이콘 중 깨지는 아이콘 일부 캡처 간격 베리어블을 등록하면서 4,8,12로 짝수로 배치해야 되는 이유에 대해 배운 게 가장 큰 거 같다.매번 간격을 아무렇게 배치하던 내게 반성하는 시간이 되었다. 5/2 4일차그림자, 반응형 그리드, 테두리 및 투명도 높낮이를 표현해주는 그림자를 스타일로 만들어보았다.2개의 properties를 주어서 그림자를 표현하고 라이트와 다크일때의 차이도 구분하며 공부했다.  반응형 그리드는 고정형, 반응형 그리고 하이브리드형을 알게 되었다.하이브리드는 보통 왼쪽이 고정, 오른쪽이 반응형으로 만들어진다고 배웠다.각 그리드의 간격 넓이, 마진도 설정해주고 반응형은 어떻게 늘어나는지까지 실습해 보았다. 다른 색이나 값 처럼 투명도나 테두리도 베리어블로 등록해 사용할수 있다는걸 알았다.원래 이런 기능이 없다는거에 놀라기도 했고, 다음에는 어떤 업데이트가 나올지 궁금해지기도 했다.  5/3 5일차스타일 파운데이션 만들기 지금까지 배운 내용을 돌아보며 하나 하나 만들어보니 내가 지금 뭐가 부족한지,또 어떤건 기억이 남는지 등, 지난 날들을 되돌아보며 재밌게 작업했던 기억이 났다. 아침에는 일정이 있어서 저녁 늦게 시작한 까닭에 정리가 조금 지저분 하면서도완벽하게 나온거 같지가 않아 아쉬웠다. 다른 러너분들은 너무 잘 만들어서 비교되기도 했다.. 무사히 1주차를 넘겼구나 하는 안도감도 들었고앞으로 남은 강의도 열심히 들어야겠다는 다짐을 했다.  5/4 특강중간점검때 다시 볼드님과 온라인으로 만나 이번 한 주의 소감과 궁금했던 점을 이야기 하였다.가장 기억에 남는건 저번 아이콘 배울 때 union을 하면 깨지는 현상를 해결하는 앤트맨 방법에 대해 들었다.단순한 방법으로 문제를 해결하는 볼드님의 모습을 보고 프로는 다르구나 라고 생각하게 되었다. 종합전체적으로 아쉬운 점도 많았지만 그래도 하루도 빼먹지 않고 열심히 한 나를 칭찬해주고 싶다.좀 더 열심히 공부해서 실전에서도 쓸 수 있는 실력을 만들고 싶다.

UX/UIfigma디자인클럽피그마_베리어블디자인

dev_traveler

[인프런 워밍업 스터디 1기 디자인] 피그마 배리어블과 파운데이션

 회사에서 프로젝트가 하나 둘씩 늘어가면서 일관성 없는 UI/UX 가 생겨나고 디자인 시스템이 있으면 좋겠다는 생각을 했습니다. 마침 사랑하는 인프런에서 피그마 배리어블을 활용한 디자인 시스템 구축 스터디를 모집하고 있었고 즐거운 마음으로 참여하게 되었습니다. 디자인 시스템이란? A design system is a collection of reusable components and clear standards that can be assembled together to build any number of applications.[1] Design systems aid in digital product design and development of products such as mobile applications[2] or websites. They may contain but are not limited to, pattern/component libraries, design languages, style guides (font, color, spacing, placement), coded components, brand languages, and documentation.It serves as a reference in combination with a design language that ensures the many different teams involved in designing and building a product create cohesive products that look and behave like each other.[3]-출처: https://en.wikipedia.org/wiki/Design_system살펴보면 디자인 시스템을 구축하기 위해서는pattern/components librariesdesign languages/brand languagesstyle guidescoded componentsdocumentation같은 것들이 필요한 것을 알 수 있습니다. 이 강의에서는 무엇을 배우나?인프런 워밍업 스터디 1기에서 학습하는 피그마 배리어블을 활용한 디자인 시스템 구축하기 - 볼드 UX 에서는 피그마로 디자인 시스템을 구축하기 위해 다음과 같은 것들을 배웁니다.피그마 배리어블디자인 파운데이션 만들기 (font, color, spacing, effect, breakpoint, border, elevation, etc)피그마로 컴포넌트 만들기 (엄청 많이 만듬)모드(light, dark)를 설정해서 배리어블 제대로 활용하는 방법[B2B] e-commerce admin page 만들기[B2C] e-learning page 만들기우리도 당장 적용해야 할까?디자인 시스템을 적용한다고 해서 갑자기 생산성이 좋아지고 일관적인 디자인으로 정리되는 것은 아닙니다. 오히려 생산성이 떨어지겠지요. 프로젝트 기간이 부족하거나 규모가 작을 경우에는 디자인 시스템을 적용하지 않는 편이 더 좋을 수도 있습니다. 디자인 시스템을 구축하는 것만으로도 시간과 노력이 많이 들어가기 때문입니다. A Design System isn’t a Project. It’s a Product, Serving Products.- Nathan Curtis 그러나 디자인 시스템이 안정적으로 도입되고 나면 생산성이 훨씬 높아질것이라 기대합니다. 디자이너의 생산성 뿐만 아니라 기획자, 개발자 등 팀 간의 의사소통도 쉬워지니 전체적인 생산성이 높아지겠지요. 디자인 시스템은 누가 만드나요?디자인 시스템은 디자이너 혼자 만드는 작업이 아닙니다. 디자인 시스템이 프로젝트 전체 팀원간의 소통 도구가 되고 제품 인터페이스의 기반이 되려면 디자이너, 개발자, 비즈니스 간의 효과적인 커뮤니케이션이 중요합니다.코드화된 컴포넌트까지 디자인 시스템에 포함하기 위해 개발팀과 긴밀히 소통해야 합니다. 개발팀에서 현재 프로젝트에서 사용하고 있는 UI 관련 라이브러리를 파악하고 이 라이브러리에서 제공하는 디자인 토큰을 디자인팀에서 반영해야 하면 개발과 디자인 단계에서 큰 도움이 될 수 있습니다.예를 들어 팀에서 tailwindCSS를 사용하고 있다면 tailwindCSS의 디자인 토큰을 디자인 시스템에 반영한 후 디자인 시스템을 구축해 나간다면 좀 더 빠르게 진행할 수 있습니다.무엇보다 디자인 토큰의 이름을 공유해서 디자인팀과 개발팀이 처음부터 같은 용어를 사용한다면 디자인 핸드오프 과정이 한결 쉬워질 것입니다. 디자인 토큰과 피그마 배리어블디자인 토큰은 모든 UI 요소의 기본 구성 요소로 진실의 근원의 역할을 하는 작고 반복 가능한 디자인 결정입니다. 다시 말해, 가장 작은 단위의 디자인 결정을 미리 해두는 것입니다. 예를 들면 색상을 미리 골라둔다거나 여러 가지 폰트 속성을 미리 정의해두는 것입니다. font, color, spacing, effect, breakpoint, border, elevation 등등 다른 디자인 요소들도 토큰화할 수 있습니다.피그마 배리어블은 이런 디자인 토큰들을 변수로 관리할 수 있는 기능을 제공합니다.프로그래밍에서 변수를 만들 때 가장 중요한 것은 변수명을 짓는 것입니다. 이 변수가 의미하는 것이 무엇인지 이름을 잘 지어야 다른 개발자에게 존경받습니다. 이렇듯 디자인 토큰을 변수로 관리한다는 것은 디자인 토큰에 이름을 지어준다는 의미도 됩니다. 파운데이션 만들기여러 종류의 디자인 토큰을 정의하고 문서화해서 파운데이션을 만듭니다. 피그마 배리어블을 사용해 컬러 파운데이션을 만드는 과정을 좀 더 살펴보겠습니다. 피그마 배리어블은 컬렉션에 저장할 수 있습니다. 컬렉션은 여러개를 만들 수 있습니다. 이 컬렉션을 레이어처럼 사용해서 primitive, theme, semantic 같은 이름으로 3개의 컬렉션을 만듭니다. primitive 컬렉션에는 이 세상에 존재하는 모든 색상 중 사용하고 싶은 색상만 모아서 담아줍니다. 이 때 이름은 보편적인 이름으로 짓습니다. theme 컬렉션에는 브랜드 컬러에 맞는 색상들을 primitive 컬렉션에서 골라 담습니다. 이 때 이름은 브랜드 컬러의 관점에서 짓습니다. 마지막으로 semantic 컬렉션에서는 실제 컴포넌트 디자인에서 사용할 색상들을 theme 컬렉션에서 골라 담습니다. theme 컬렉션에 없으면 primitive 컬렉션에서 담아도 괜찮습니다. 이 때 이름은 컴포넌트 관점에서 짓습니다.  이렇게 계층 구조로 배리어블 컬렉션을 만들고 primitive 나 theme 컬렉션은 배리어블 사용 시 드러나지 않도록 숨긴 후 semantic 컬렉션의 배리어블을 사용해서 컴포넌트와 페이지를 만듭니다. 피그마 플러그인앞에서 살펴본 디자인 토큰 배리어블 등록 과정에는 단순 반복 작업이 다소 포함되어 있습니다. 그러나 피그마에는 재미있고 편리한 플러그인들이 많아 이 등록과정이나 문서화 과정을 쉽게 할 수 있는 방법도 있으니 이런 방법을 사용하는 것을 강력 추천드립니다. 인프런 워밍업 클럽 1주차 후기지식공유자 볼드님과 인프런이 준비를 너무 잘해주셔서 서로의 학습을 응원하며 재미있게 작업을 진행하는 분위기가 만들어졌습니다. 이런 커뮤니티가 저에게는 학습 뿐만 아니라 일상의 소소한 즐거움을 줍니다. 워밍업 클럽에 참여하신 모두 완주하길 바라며 수료식에서 한 단계 성장한 모습으로 만났으면 좋겠습니다. 화이팅 🔥

UX/UIfigmadesgin_systemdesign_tokenvariable

weather26

[인프런 워밍업 스터디 클럽 1기 디자인] 1주차 발자국

1주 차 강의먼저, 피그마 베리어블과 디자인 토큰/디자인 시스템 개념에 관한 강의를 들었다. 피그마를 자주 사용하고 있었으나 "로컬 스타일"만 사용하고 있었다. 베리어블은 사용하기 꽤 어렵다고 생각하고 있었다. 하지만 색상, 간격, 타이포그래피, 아이콘 등 강의를 들으면서 순서대로 따라 하다 보니 앞으로 어떻게 써야 하는가에 대해 알게 되었다. 특히, 회사에서 업무를 하면서 "타이포그래피"를 직접 만들고 정하는 게 어려웠는데, 플러그인을 통해서 쉽게 할 수 있다는 것을 알고 바로 적용해 봐야겠다는 생각이 들었다. 미션이번 주 미션은 스타일 가이드 문서 제작을 위해 다양한 베리어블을 만들고 등록하는 것이 미션이었다. 처음에 미션만 보고 '이걸 직접? 전부 다 할 수 있다고?'라는 의심으로 시작했는데, 차근차근 설명해 주시고 플러그인을 통해 작업을 하다 보니 쉽고 빠르게 할 수 있었다. 가장 좋았던 것은 하나씩 등록하는 과정을 결과적으로 "문서화"작업을 한 것이었다. 매번 디자인 시스템이라는 것을 만들고 싶어도 어떻게 해야하는지 모르고, 어렵게만 느껴졌는데, 이렇게 하다보면 만들어 볼 수 있겠다는 용기가 생겼다. 회고잘했던 점 강의 듣고 나중에 작업하는 게 아니라, 직접 따라 하면서 만들어 본 것 다양한 플러그인을 써보고 정리한 것아쉬웠던 점 이번에는 시간이 부족해 강의를 몰아서 들었지만, 다음에는 공부할 시간을 확보해서 들어야겠다.보완하고 싶은 점 공부하고 있는 것과 실제 실무에서 사용하는 것을 연결해서 생각하고, 작업해야겠다.

UX/UIFigma인프런워밍업클럽

해피페이스

모든 구멍에 맞는 열쇠는 없다.

안녕하세요! 저는 이력서 첨삭을 주제로 멘토링을 하고 있는 해피페이스 입니다.(저에 대한 간단한 소개)What I do아침출근 시간이 너무 아까워서 출근길 독서 사진 인증방을 운영하고 있고내가 아는 것을 남에게 알려주는 것이 재미있어서 프로그래밍 레슨도 하고 있습니다.Who I am미술을 하다가 HTML, CSS, JS만 할 줄 알면 되는 줄 알고 개발자의 길로 들어섰습니다. 제가 그 동안 이력서 첨삭을 하면서, 그리고 스스로 이력서를 쓰면서 느꼈던 점들을 나누어보려고 합니다.주제는이력서쓰면서 가장 많이 저지르는 실수입니다. 첫번째 실수: 이력서가 한편의 글이고 논설문이라는 것을 놓쳤습니다.이력서는 독자가 채용 담당자이고, "제가 이 직무에 적합합니다."라는 주제를 가지는 글입니다.구체적으로는 "00기업과 내가 잘 맞는 이유", "00팀의 팀원으로 적합한 이유"가 됩니다.그러니까 한줄 소개가 글의 서론에 해당하는 주장이 되고,그 아래에는 주장에 대한 근거가 나와야 합니다.예를 들어 회사 A가 지식을 나누고 소통하는 사람을 우대한다고 합니다. 지원자 B는 자신이 그 동안 관련 활동을 해왔기 때문에 적임자라고 생각합니다. 이력서를 관련 내용을 강조하여 작성하였습니다. 예시) 주장: 지식을 나누는 개발자 000입니다.❌: 이력서 내용에 지식을 나누는 것과 관련된 것이 하나도 없음 -> 주장만 있고 근거가 없는 글이 됨⭕: 이력서 내용에 지식을 나누었던 경험이 트러블 슈팅 및 활동에 녹아있음 -> 주장에 근거가 생김 두번째 실수: "개발을 잘하는 사람임"을 어필 했습니다.신입시절, 저는 "나 이만큼 똑똑해. 그리고 이만큼 노력해"를 어필하려고 했던 것 같습니다.그런데 이것은 자칫 잘난척으로 보일 수 있어요. 채용담당자가 원하는 것은"이 사람이 우리 팀에서 나와 함께 일할 수 있는 사람인가?" 하는 것입니다.같이 일할 동료를 뽑는 것이기 때문에, 잘하는 것 보다 잘 어우러지는 것이 중요합니다.혼자 잘하는 사람이 아니라 함께 잘할 수 있는 사람을 찾는 것이죠.기술적인 내용도 중요하지만, 그만큼 내가 어떤 사람인가? 를 알려줘야 합니다. 세번째 실수: 이력서가 탈락하면 "내 능력이 부족했나?" 생각했습니다.내 이력서가 탈락한 이유는 채용 담당자말고 아무도 모를것입니다.왜냐하면 너무 많은 변수가 있습니다.그러면 떨어져도 퇴고를 하지 말라는 이야기인가요?그것은 아닙니다. 이력서 탈락에 대해서 내 능력 부족이라고 인식하는 것을 지양 하자는 것입니다."포트폴리오가 부족했나?" 혹은 "기술적인 내용을 더해야하나?" 고민하는 것이 아니라,불합격 요인이 될 만한 것들을 제거하는 방향으로 고쳐야 합니다. 불합격 요인의 예시: 내가 어떤 사람인지 드러내지 않는다.(A, B 회사에 지원한 경우)A회사는 활달하고 적극적인 리더쉽 있는 사람을 찾고 있고, B회사는 조용하고 차분하게 일을 꼼꼼히 처리할 사람을 찾고 있음.❌ : 자신이 사용해본 기술만 강조하는 경우 -> 어떤 사람인지 알 수 없다. A, B 회사 모두 불확실 하므로 면접에 부르지 않는다.⭕: 팀원 간의 트러블을 회피하지 않고 처리했다. 결국 팀원 한명이 나갔지만, 남은 팀원들끼리의 결속력을 다지기 위해서 노력했다. -> B회사는 지원자의 기술적인 부분이 부족하다고 여겨 면접에 부르지 않음/A회사는 지원자의 소통능력을 좋게 봐서 면접에 부름⭕: 조용한 성격이라서 팀플을 많이 한 것은 아니지만 개인 프로젝트의 완성도가 높음. 기술적으로 어려운 것도 배워서 바로 쓸 수 있음 -> A회사는 지원자가 팀프로젝트 경험이 적은 것을 우려하여 면접에 부르지 않음/B회사는 지원자가 상세히 기록한 블로그나 개인 프로젝트를 집요하게 완성한 것을 좋게 보고 면접에 부름 네번째 실수: 모든 회사에서 공통적으로 선호되는 인재상이 있다.물론 공통적으로 선호하는 특징은 있을 수 있다. 개발 실력이 좋으면 당연히 좋고, 소통이 잘 되면 좋고, 책임감이 있으면 좋다.그런데 기술적으로 너무 훌륭하고, 문서도 잘 작성하며 동료와 잘 지내고 리더쉽을 발휘하는 사람이 있을까?모든 조건을 다 만족 시키는 회사가 없듯 모든 조건을 다 만족하는 지원자도 없다.그렇기 때문에 팀마다 중요하게 생각하는 것이 있고, 덜 중요하게 생각하는 것이 있다. 즉 나 또한 좋은 회사/팀을 찾기 보다 내게 맞는 팀을 찾는 것이 좋다.(내 열쇠에 맞는 열쇠 구멍을 찾는 것.)마음에 드는 회사에 지금 채용 공고가 나와있지 않더라도 조심스럽게 메일을 보내보세요.제가 했던 마지막 실수는 도움을 청하는 것이 민폐라고 생각했던 것입니다.그런데 도움을 청하면 혼자 끙끙 앓으며 생각보다 쉽게 풀리기도 합니다.때로는 내가 생각했던 문제는 생각보다 큰 문제가 아니고, 사실은 다른 곳에 문제가 숨어있기도 하죠.여러분은 저와 같은 실수를 하지 말고, 적극적으로 인프런 멘토링 코너, 커피챗 어플 등을 이용하셨으면 좋겠습니다.저는 멘토링을 사이드잡이 아니라 취미개념으로 하고 있어서 가격을 비싸게 책정하지 않지만 대신 일주일에 두번밖에 하지 않습니다. 저 뿐만 아니라 인프런 멘토링에 많은 멘토님들이 계시니 한번 이용해보시는 것을 추천해드립니다. 다른 서비스에 비교해 가격 책정이 자유로워서, 비용적인 부분이 걱정이시라면 가격을 저렴하게 하시는 분들도 찾을 수 있습니다. 그럼 마지막으로 존 듀이의 명언으로 글을 마치겠습니다.세상의 모든 차이는 '할 말이 있는 것'과 '말을 해야 되는 것' 사이에 있습니다.읽어주셔서 감사합니다. :)

취업 · 이직이력서이력서첨삭멘토링프론트엔드

수진

[인프런 워밍업 스터디 1기 디자인] 1주차(스타일 가이드 만들기) 발자국

월요일부터 본격적으로 시작한 인프런 워밍업 스터디!나는 피그마 베리어블을 활용한 디자인 시스템 구축하는 강의를 선택했다! 이 강의를 선택한 이유현재 다니고 있는 회사에는 디자인 시스템이 없다. 없는 상태에서 일을 하다 보니 페이지마다 디자인들이 일관성 없이 만들어진 것을 보고 얼른 디자인 시스템을 도입해야겠다는 생각이 들었다…하지만 나는 디자인 시스템을 처음부터 구축해본 적은 없어서 강의를 알아보던 중에 인프런에서 워밍업 스터디를 한다는 것을 보았다. 때 마침 베리어블을 활용하여 디자인 시스템 구축 방법을 볼드 강사님의 피드백을 받으면서 배울 수 있는 강의가 있어 당장 신청했다! 1주차 강의 후기1주차 강의는 스타일 가이드 만들기이다.월요일은 피그마 베리어블과 디자인 토큰 / 디자인 시스템 개념 이해하기라는 이론 강의였다. 디자인 토큰과 시스템의 개념을 알고 스타일 가이드를 만드니까 더 이해하기 쉬웠다.화요일부터 실습 강의가 들어가는데 동영상만 봤을 때는 음 이 정도면 쉬워서 미션도 금방 끝나겠네! 하면서 목요일부터 두 개씩 해야지! (멈춰 이 좌식아..!) 하고 집에서 쉬었는데 그런 생각은 하지 말았어야 했다..목요일 퇴근 후 직접 피그마를 켜서 따라해보니까 생각보다 오래 걸리고 결국 미션을 하나 밖에 못 했다..😭그래서 미션이 밀려서 금요일부터 토요일 새벽까지 미션3까지 하고 잤다ㅎ.. 😮‍💨근데 여러 인터넷 강의들을 들어봤지만 이번 인프런 워밍업 스터디는 확실히 다른 분들과 같이 공부하다 보니까 학원 다니는 느낌이 들어서 너무 좋았고 무엇보다 볼드 강사님이 내 미션을 보고 코멘트도 해주셔서 너무 좋았다!! 인프런에서 만나기 전에 인스타에 좋은 디자인 정보들을 올려주셔서 팔로우하면서 일 할 때 참고 많이 했었는데 이렇게 실시간으로 피드백을 받으니 너무너무 좋았다!! 2주차 강의 목표2주차 강의 때는 자만하지 말고 매일매일 미션을 해야겠다는 생각이 들었다. 그래서 2주차 강의 목표를 새워본다면매일 미션 완수하기출근하면서 강의듣기일단 이렇게 2개를 목표로 완주까지 달려볼 것이다!!  

UX/UI워밍업클럽디자인시스템볼드피그마워밍업스터디

한국 IT 용어 이야기 (7) - "매니저"

이번 글에서는 너무나 두리뭉실하게 쓰이고 있는 각종 매니저에 대해 이야기해 보려 한다. 일단 오랜 기억부터한국에서 매니저와 미국에서 매니저내 기억의 가장 오래된 매니저는 나무위키의 순서와 일치한다. 연예인 혹은 운동 선수의 일들을 도와 주는.. 연예인 쪽에서 유병재, 정준하 씨, 그리고 영화에서의 제리 맥과이어 등. 코미디의 소재로 접하기 시작해서 잘못된 선입견을 가지게 되었고 은연중에 '하대'를 기본으로 생각하는 직군으로 생각하고 있었다.(미국에서) 취직을 하니 나에게 매니저가 생겼고, 나도 매니저가 되면서 교육을 받았는데, 이는 한편으로 많이 달랐더랬다. 이른바 '생사여탈권'을 쥐고 있고, 그 사유가 'performance'일 경우 외국인 노동자인 나에게 추방까지 영향을 줄 수 있는 사람이 매니저라는 것이었고, 한국에서 알고 있던 경험과 정반대의 컨셉이었기에 꽤 충격이 컸었다. 그래도 한동안 직급/직책에 explict 하게 manager 라고 주어지지는 않았고, manager/reportee 의 상하관계가 맺어졌었고, 직군에 나타나는 매니저(들)은 또 다른 이야기라 하겠다.직군으로서 다양한 매니저들구글 내에서 다양한 직군으로서 매니저들을 만났다. 가장 가까이에서부터 만났던 것부터는Engineering ManagerProduct Manager / Associate Product ManagerTechnical Program ManagerAccount Manager / Technical Account ManagerGeneral Manager생각해 보니 밖에서도 property manager, facility manager, restaurant manager 등의 직함들을 만날 수 있었던 거 같다.그리고 한국에 와서 알게 된 project manager, CX manager 같은 더 많은 매니저들. 모 회사는 직급 파괴의 수단으로 모두에게 매니저를 붙여 주기도 한다고 들었고, 무의식적으로 받아 들일 때는 쉬웠는데, 촘촘히 생각해 보면 일이 커진다 싶다. (개인적인) 깨달음과 정리들매니저가 뭘 하는 사람인가에 대한 질문에 원래대로 한 발 돌아가서 개인적으로는 아래와 같은 잠정적인 정리이다.직함과 상관 없이 manager/reportee 의 관계의 경우- reportee 들을 이용해서 팀 전체의 성과를 높이고- reportee 들의 행복을 바라면서 자랑도 대신 해 주고- 평가 시기를 제외하고는 동원할 수 있는 최대한으로 일을 잘 할 수 있게 하고- 그래서 팀의 운영의 credit 을 manager가 가지고 가고- 평가 시기에 가장 바쁘고 힘이 있도록...직함에 있는 'manager'는- manager를 제외한 나머지가 어떻게된 "잘" 되게 하는 게 역할-- product manager 는 product 이 잘 되어야 하고-- account manager 는 account 가 더 흥해야 하고... 등...- 고충 처리반의 느낌에 가깝고, 대상의 행복, 성과 or feedback 이 주요 평가 지표- '하대'까지는 아니라도 갑을 관계가 있다면 '을'에 가까움.- engineering manager 의 경우 engineer 들의 고충을 이해하고 처리해 주는 게 주 업무... --a회사에서 상하관계를 맺어 주는 것에 대한 업권 전체에 대한 여러 고민들이 섞이기에 쉬운 문제는 아니라 하겠고, 직함이 세분화되는 것 자체도 주는 질서가 있기에 나의 정리는 하나의 의견으로 각자의 고민이 있다면 조금 정리하는 용도로 쓰이면 한다.직군으로서는 아래의 것들이 가장 헷갈린다... Product manager vs Program manager vs Project manager ( vs Product owner ) 아주 작은 startup 의 경우 혹은 직군 파괴의 회사의 경우는 어떻게 해야 할까... 이 책이 가이드라인은 줄 수 있지 싶다..ps. 한국 IT 용어 이야기 연재(?)는 (8) '팀'으로 일단 마무리하려 합니다. 읽어 주셔서 감사합니다...

교양한글용어영어

상은/Liane

[인프런 워밍업 스터디 1기 디자인] 1주차 발자국

 워밍업 스터디에 참여하게된 이유작년 여름, 배리어블 업데이트 이후 많은 사람들이 해당 기능을 필수로 알아야한다고 했지만토큰에 대한 개념이 부족하기도하였고, 기존에 사용하던 스타일을 통해서도 충분히 작업이 가능했기 때문에 쉽사리 사용하지 못했다.시간이 생긴 지금, 개념을 정확히 알고 배리어블을 사용해보고싶었다.인스타 팔로우하던 볼드님이 강의를 진행한다고 하셔서 바로 신청하게되었고 신청하길 정말 잘한 것 같다.강의를 보며 공부하면.. uiux 직군으로 이직하길 마음먹고 독학으로 피그마를 공부하던 시절과 함께 회사에 사수가 없어 혼자서 고군분투하며 작업하던 나날들이 떠오른다 .. ㅠㅠ 더 열심히 공부해야하는 이유가 늘 떠오른다.이직할때는 개념을 완벽히 이해하고 다양한 기능을 사용하여 더 빠르게 작업 할 수 있는, 스킬업이 되어있는 상태였으면 좋겠다.   기억하고 싶은 부분들색상 배리어블의 구조Primitive : 색의 원시값을 저장해 놓은 디자인 언어의 기본 값Theme : 시멘틱 칼라로 브랜드 모드를 적용하기 위한 목적Semantic : 시맨틱 칼라로 라이트/다크 모드를 적용하기 위한 목적색상 배리어블 등록시border의 색상은 text와 색상이 겹치기 때문에 색상이 살짝 빠진 색상으로 선택해준다. 스타일은 지우기 색상 배리어블 등록 후 적용하려보면, 스타일 목록과 함께 노출되기 때문에 원하는 색상을 찾을때 너무 복잡하기때문에 등록된 스타일은 지우는 것이 좋다.플러그인apply variables혹여나 배리어블을 적용하지 못했다면, 하나하나 눌러서 확인하지 말고 해당 플러그인을 사용하여 자동으로 적용시킬 수 있음styler한번에 text styles 등록 가능frameall선택한 layer들에 fram이 씌워짐색상이 있는 아이콘을 다른 아이콘으로 변경하는 경우, 전체 색상이 변하지 않는 이유A는 1개의 vector가 색상 1개만 먹히기 때문에 B의 2개의 vector중 1개만 색상이 변함[해결 방법]B의 vector를 union을 사용하여 하나로 만들어주면됨 ** 대신 이름은 동일한 이름으로 변경해줘야함합치기 전에는 stroke에 색상이 채워졌었는데, 합친 후에는 fill로 색상이 채워짐

UX/UI인프런워밍업스터디

yuri

[인프런 워밍업 스터디 1기 디자인] 1주차 발자국 및 회고

 [인프런 워밍업 스터디 1기 디자인] 1주차 발자국실무에서 피그마를 사용하지만, 손에 잘 익지 않았었고 피그마 툴의 기능이 계속해서 업데이트되어부분적으로 공부를 해보아도 사용하지 않으면 잊어버리게 되어서개인 스터디 차원에서 피그마 툴도 공부하고 디자인 가이드를 더 체계적으로 알아가고자스터디에 신청하게 되었습니다.업무와 병행하다 보니 스터디에 대한 이해가 부족해서 과제 제출하며 실수를 여러번 하였는데,디스코드를 통해서 실시간으로 피드백 주셔서 틀린 부분을 인지하고 공부할 수 있었습니다.1주차 강의 수강을 통해 배운 것베리어블 기능을 활용해서 피그마에서 디자인 가이드를 관리하는 법다양한 플러그인을 활용해 디자인 가이드를 구축하는 법베리어블의 구조 네이밍 하는 방식과 규칙 등2주차에서 보완하고 싶은 점강의를 들었지만, 놓치는 부분이 있어서 강의를 다시 재수강 할 필요를 느꼈습니다.미션을 미리미리 해두어야 차후에 페이지 제작이 수월할 것 같습니다.강의를 따라하는 것에 그치지 않고 다시 활용하는 방식으로 실습해야 할 것 같습니다.강의가 초반 기초부터 응용까지 알차게 짜여있어서 수강하는 데 어려움이 없던 것 같고일일 과제와 회차가 정해져 있어서 동기부여도 되는 것 같습니다.스터디 하시는 분들 모두 한 주 고생 많으셨고 앞으로도 화이팅입니다! ✊✊

UX/UI워밍업스터디UIUX디자인디자인시스템

cynh K

[인프런 워밍업 스터디 1기 디자인] 1주차 발자국 및 회고

피그마 베리어블을 활용한 디자인시스템 구축 1주차 회고1주차 회고를 시작하려고 합니다.스타트업에서 1인 디자이너로 일하며 디자인시스템의 필요성을 절실히 느껴 처음으로 접근해보았던 디자인시스템,현재 약 3년차 프로덕트디자이너로 실무를 경험하며 '현재 내가 가장 모르겠고 자신없는 분야는 디자인시스템이다' 라는 나만의 약점을 이젠 강점으로 상쇄하고자 신청한 스터디였습니다.업무와 병행하다보니 초반참여가 어려웠는데, 하나하나 강의 수강을 완료하고디스코드,노션,PDF 등 다양한 자료와 동기부여,피드백을 적극적으로 해주시는 볼드 멘토님과 열정적인 멘티분들을 보며할 수 있는 만큼 최대한 임하자! 하며 진행했던 것 같습니다.한 주가 지나고 느낀바가 너무 커 이 부분 개선해 2주차에 접근하고자 합니다..1주차 느낀점오전시간 활용퇴근 후 수강은 피로도가 높아 집중하기 어려웠습니다. 출근 전 오전시간을 활용해 수강하고, 퇴근 후의 시간은 추가/보완 하는 시간을 가지면 좋을 것 같아요.미루기 금지! 대비할 것예측가능한 선에서 업무와 약속을 정리하고, 강의출석을 성실하게 하고싶다는 생각이 절실했습니다. 2주차 시작에 있어 다짐스타일가이드를 재수강 후 정리하며, 내가 좋아하는 구성의 파운데이션 구성하기멘토님이 정의하신 스타일 외에 나만의 스타일도 생각하며 만들기최대한 계획적으로 임하고 싶은데 변수가 없길 바래봅니다!스타일가이드 정리하다 뭔가 이상하다 싶어 수정할게 많아졌는데 그것보다 발자국 먼저 남기러 왔습니다ㅠ!볼드님도 멘티님들도 스터디 하는 모든 분들도 한 주 고생하셨고,다음주도 화이팅입니다!

UX/UI인프런디자인시스템피그마워밍업스터디

젬졍

[인프런 워밍업 스터디 1기 디자인] 1주차 발자국🐾

일주일간의 학습에 대한 회고커리큘럼을 따라 매일 아침 강의를 듣고 첫 주를 보냈습니다. 1주 차의 솔직한 후기는 '복습할 시간이 부족해 완벽하게 하지 못하는 내가 밉다.' 였습니다😭. 그럼에도 불구하고 이번 주 강의를 수강하고 모든 미션을 완수할 수 있었던 것은 디스코드에서 열정적으로 지도해 주신 볼드 멘토님과 끝까지 미션을 수행하는 멘티들 덕분이었습니다. 늘어나는 스레드를 보며.. 매일 피그마를 열 수 있었습니다💪💪. 앞으로 더 분발해서 끝까지 완수할 수 있도록 노력하겠습니다!일주일 동안 잘한 것아침마다 디자인 공부한 것: 오전마다 디자인을 공부하는 습관을 기를 수 있어서 좋았습니다. 회사를 가기 전에도, 간 후에도 강의를 들은 나. 매우 칭찬해.포기하지 않은 것: 하마터면.. 1주 차에 하차할뻔 했다..아쉬웠던 점기존의 스타일 가이드라인에 의존하는 것: 이번 수강을 통해 새로운 디자인 시스템을 구축할 수 있도록 하는 것이 제 목표인데, 어렵다고 느끼는 부분은 어느새 멘토님의 가이드라인을 그저 따라 하려 하더라고요. 혼자서 고민해 보고 디자인 시스템을 만들어 나가는 시간을 가져야겠습니다.복습시간이 적었던 점보완하고 싶은 점커뮤니티를 적극적으로 이용하기: 친절왕 멘토님의 활동을 보며, 다음 주부터는 멘토님에게 많이 질문도 하고, 워밍업 스터디를 적극적으로 활용해야겠다는 생각을 했습니다.복습을 저녁으로 미루지 않는 삶 액션 플랜rem에 대해 좀 더 이해하기회사 네이밍 엑셀 시트 구성(잊어먹었다..)가이드라인-컬러 부분 가독성 높이기: 읽기 쉽고 이해가 쉽도록 수정해야겠습니다.다음 주에는실습을 많이 해보는 방향으로 고쳐나가기1주 차 복습 잊지 말기: 컴포넌트가 잘 구성되려면 파운데이션이 잘 갖추어져 있어야 한다!!다음주 업무량이 많은데…잘할 수 있겠죠?😱 힘내라 다음주의 나!

UX/UI워밍업클럽디자인시스템피그마

이용수

[인프런 워밍업 클럽 1기] BE 3일차 과제

[인프런 워밍업 클럽 1기] BE 3일차 과제본 게시글은 다음 강의 내용을 진행하고 있습니다.자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] - https://inf.run/XKQg[키워드]익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스키워드를 참고해 찾아본 각 키워드의 정의와 특징을 간단하게 정리해보고 질문에 답변해보려고 한다. 익명 클래스정의이름이 없는 클래스로, 클래스의 정의와 동시에 객체를 생성할 수 있는 방법이다.특징클래스 이름이 없어 특정한 위치에서 직접적으로 선언되며, 이와 동시에 객체가 인스턴스화 된다.주로 일회성으로, 재사용이 필요 없는 특정 상황이나 동작을 구현하는 데에 주로 사용된다.복잡한 클래스를 별도로 선언할 필요 없이 필요한 구현 부분만을 직접 작성할 수 있다.코드를 더욱 간결하고 읽게 쉽게 만들며, 불필요한 클래스 선언을 줄여준다. 람다정의코드 가독성을 위해 도입된 익명 클래스 객체를 더욱 더 간결하고 명확하게 표현할 수 있도록 하는 것이다.특징함수의 이름과 반환값이 없어져 익명 함수의 한 종류로 취급한다.함수를 변수처럼 전달하거나 반환하는 데 사용된다.익명 함수를 사용하는 것보다 더 적은 코드로 동일한 내용을 구현할 수 있다. 함수형 프로그래밍정의프로그래밍 패러다임 중 하나로, 순수 함수를 기반으로 데이터 처리와 상태 변화를 최소화하는 방식의 프로그래밍 기법이다.특징동일한 입력에 대해 항상 같은 결과를 반환하며, 외부 상태를 변경하지 않는 함수인 순수 함수를 사용한다.순수 함수를 사용하여 코드의 복잡성에 따른 부작용을 최소화하여 프로그램의 유지 보수와 테스트를 용이하게 하도록 한다. @FunctionalInterface정의함수형 인터페이스를 선언할 때 사용하는 어노테이션이다.특징함수형 인터페이스는 하나의 추상 메서드만을 가지고 있어야 한다.인터페이스에 어노테이션을 사용하면 해당 인터페이스가 함수형 인터페이스인지 검사한다.다음과 같은 형식으로 함수형 인터페이스를 선언한다.@FunctionalInterface interface MyFunction { void myMethod(); } // 함수형 인터페이스의 구현 MyFunction func = () -> System.out.println("함수형 인터페이스의 메소드 구현"); 스트림 API정의컬렉션, 배열 등의 저장 요소를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스이다.특징원본 데이터를 조회하여 별도의 Stream 객체로 생성을 하기 때문에 배열의 정렬이나 필터링 작업을 하더라도 원본 데이터를 변경하지 않는다.이미 사용이 되어 닫히면 재사용이 불가능하며 새로운 Stream을 생성해주어야 한다.Stream 내에서 내부적으로 반복문을 처리하기에 간결한 소스코드의 작성이 가능하다.  메소드 레퍼런스정의메소드를 직접 참조하여 람다 표현식을 더 간결하게 만들어주는 방법이다.특징기존의 메서드 정의를 재활용해 람다와 같이 사용할 수 있다.메소드 레퍼런스의 종류종류 : 정적 메서드 참조 람다 표현식 : (x) -> ClassName.method(x) 메서드 참조 : ClassName::method 종류 : 인스턴스 메서드 참조 람다 표현식 : (x) -> obj.method(x) 메서드 참조 : obj::method 종류 : 매개변수의 메서드 참조 람다 표현식 : (obj, x) -> obj.method(x) 메서드 참조 : ClassName::method 종류 : 생성자 참조 람다 표현식 : (x, y) -> new ClassName(x, y) 메서드 참조 : ClassName::new [질문]Q. 자바의 람다식은 왜 등장했을까?A. 궁극적으로 람다식이 등장한 이유는 불필요한 코드를 줄이고, 가독성을 높이기 위해서이다.질문에 대한 자료를 찾아보며 다음과 같은 등장 배경을 찾아볼 수 있었다.람다를 지원하기 전의 자바는 클래스에서 메서드를 정의하고, 필요할 때 메서드를 호출하는 형태의 완전한 명령형 프로그래밍 패러다임을 고수하고 있었다.그러나 자바를 사용하는 개발자들은 개발 규모가 커지면서 복잡하게 얽힌 코드를 유지보수 하는 것이 힘들어졌다.모든 것을 순수 함수로 나누어 문제를 해결하는 함수형 프로그래밍 패러다임이 나타나면서 자바에서도 이러한 함수형 프로그래밍 패러다임의 이점을 가져오기 위해 람다식이 등장하게 되었다.람다식을 이용하면 함수를 일급 객체로 다루어 함수형 프로그래밍의 패러다임을 자바에서도 적용할 수 있게 되었다.즉, 람다식이 등장하며 자바는 객체지향 언어이며 함수형 언어의 기능을 갖추게 되었다고 할 수 있다.그렇게 함수형 프로그래밍 패러다임을 통해 기존 코드에서 불필요한 코드를 줄이고, 가독성을 높일 수 있어 유지보수 측면에 도움이 되었다.이러한 이유로 불필요한 코드를 줄이고, 가독성을 높이기 위해서 함수형 프로그래밍 패러다임을 도입하려 했고 그러기 위해 람다식이 등장했다는 것으로 이해했다.Q. 람다식과 익명 클래스는 어떤 관계가 있을까?A. 람다식과 익명 클래스는 공통적으로 함수형 프로그래밍을 지원하기 위해 익명 함수를 만드는데 사용되지만 다른 부분도 존재하며 주로 익명 클래스를 대체하여 더 간결하고 가독성 높은 코드를 작성하기 위해 람다식을 사용한다.람다식이름이 없는 메서드입니다.추상 및 구체 클래스를 확장할 수 없습니다.단일 추상 메서드를 포함하는 인터페이스를 구현할 수 있습니다.인스턴스 변수를 선언할 수 없습니다.람다 표현식을 인스턴스화 할 수 없습니다.람다 표현식 내부의 this 키워드는 현재 외부 클래스 객체를 나타냅니다.익명 클래스이름이 없는 클래스이다.추상 및 구체 클래스를 확장할 수 있다.여러 추상 메서드를 포함하는 인터페이스를 구현할 수 있다.익명 내부 클래스 내부에서 인스턴스 변수를 선언할 수 있다.익명 내부 클래스를 인스턴스화 할 수 있다.익명 내부 클래스 내부의 this 키워드는 현재 익명 내부 클래스 객체를 참조한다. 다른 부분이 있음에도 불구하고 람다식을 사용하는 이유는 람다식을 사용하면 익명 클래스를 사용한 것보다 더 간결하고 가독성 높은 코드를 작성할 수 있다.예를 들어, 문자열 리스트를 정렬하는 예제를 익명 클래스와 람다식으로 구현한 과정을 비교해보겠다.익명 클래스 Collections.sort(words, new Comparator<String>() { // 익명 클래스 정의 public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } });람다식Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));코드를 상당히 줄여주고 보기 편해진 것을 확인할 수 있다. Q. 람다식의 문법은 어떻게 될까?람다식은 기본적으로 매개변수(Parameter) 와 화살표(->)와 실행문(expression)으로 구성된다.다음과 같은 매커니즘으로 람다식을 구현한다.기본 : (int num) -> {System.out.println(num);} 단일 실행문은 중괄호 제거 : (int num) -> System.out.println(num); 단일 인자는 타입 생략 : (num) -> System.out.println(num); 단일 인자는 소괄호 제거 : num -> System.out.println(num); 인자가 없으면 소괄호 필수 : () -> System.out.println("매개변수 없음"); 인자가 여러개면 소괄호 필수 : (x, y) -> System.out.println(x, y); 인자가 없고 반환값이 있으면 : () -> {return value;}; 실행코드가 return문 뿐이면 return 키워드 생략 가능 : () -> value; 매개변수, 리턴타입 둘다 있으면 : (x, y) -> x+y; [Java] 익명 클래스 (Anonymous Class)란? — 개발자의 서랍 (tistory.com)[Java] Stream API -1 이해하기: 용어 및 Stream 생성 — Contributor9 (tistory.com)코드 가독성 높이는 자바 람다식과 함수형 인터페이스 | 요즘IT (wishket.com)[Java] 람다식(Lambda Expression)과 함수형 인터페이스(Functional Interface) - (2/5) - MangKyu's Diary (tistory.com)[Java]익명 내부 클래스와 람다식의 차이점 (tistory.com)람다식(feat. 익명 구현 클래스 vs 람다식) (tistory.com)

인프런워밍업백엔드

쩡니니

[인프런 워밍업 클럽] 첫번째 발자국

 프롤로그이번에 내가 듣게 된 강의는피그마 배리어블을 활용한 디자인 시스템 구축하기이다!회사에서 최근에 디자인 시스템 업데이트가 있었다.사수님이 메인으로 가져간 업무였기 때문에, 나는 어떻게 변경되었는지 전달만 받았다.사수님이 팀에 공유하는 모습을 보며,,, 나의 부족함을 느꼈다...디자인 시스템... 나에겐 너무 막막한 일이였다.만약 사수님이 없었고 내 업무였다면 나는 엉망진창으로 만들었을것이다 ㅠ그래서 이번에 디자인 시스템에 공부해보자 하고 이 강의를 듣게 되었다!   색상 베리어블색상 배리어블을 들어가기 전, 디자인 토큰과 배리어블에 대해 배우는 시간이 있었다.알고있었고 사용도 했었지만 이렇게 꼼꼼히 짚고 넘어가니 좋았다. 대충만 알고있었던 지난날이 후회되는 순간이였다.배리어블을 통해 색상을 등록했다. 이전엔 등록해져있는 색상만 사용했었는데, 직접 등록해보니 재밌고 새로웠다.사실 이번에 등록한것도 강사님이 하란대로 하긴 했지만 ㅠ 그래도 내것으로 흡수해야지많은 색상을 등록하다보니 배리어블 구조에도 익숙해져간다 히히   타이포그래피타이포그래피는 사이드 프로젝트 할때도 많이 만들어왔고, 또 내 기준 가장 쉬웠기 땜에 잘 따라간것 같다.아는걸 점검하는 시간이랄까? >_<   그림자쉐도우에 대해서는 알고있었고, 잘 활용해 왔었지만 베리어블 등록이 가능한지는 몰랐다.그리고 솔직히 말하면 다크모드에서도 쉐도우를 주는지 몰랐다.. (다크모드엔 쉐도우 안들어가는걸로 알고 있었음)그래서 다크모드 쉐도우 만들었떤게 특별한 경험이였다.회사 업무할때도 유용하게 쓸듯!   반응형 그리드반응형 그리드도 많은 강의를 따라하며 만들어봤떤터라 쉽게 따라갈 수 있었다. 우리 회사는 앱서비스 회사라 많이 안쓸것 같지만 그래도 배워놓는게 좋지! >_<  후기이번 일주일간 강의를 들으면서 베리어블의 구조에 대해 빠삭하게 알게 된 것 같다. 그리고 실무에서 사용할 수 있는 스킬들도 많이 배워서 너무 좋다!!!미션도 너무 쉽지도 어렵지도 않은 미션들이여서 천천히 따라하기 좋았따. 미션이 없었으면 뭔가 늘어졌을것 같기도?미션이 좀만 더 어려워지면 좀 힘들것 같긴 하지만 ㅠㅠ베리어블에 편집에서 원하는 요소에서만 보여지게하는거(?) 같은 경우는 회사에 적용했더니 사수님이 칭찬해주셨따.다음 강의가 기대된다!   

UX/UI

한국 IT 용어 이야기 (6) - 리뷰

한글로도 영어로도 아주 많이 쓰이고, 다른 단어들과 붙어서도 많이 쓰인다. 언뜻 생각나는 것만으로도 코드 리뷰, 프로젝트 리뷰, UI 리뷰, 리걸 리뷰, 피어 리뷰 등등이 생각나고, 가볍게 '시간 나면 봐 달라' 부터 '승인해 달라' 까지의 스펙트럼이 넓어서 영어로도 어려웠고, 한국에 와서는 Agile의 파도 아래에서 쓰임이 참으로 어려웠던 단어이다.곰곰히 생각해 보면 조금 더 한국말로 검토 혹은 승인, 결재 등도 있겠지만, 역시 딱딱해 지는 것은 어쩔 수 없겠다. 결과적으로는 what's next를 잘 정의해 놓아야 불필요한 오해들이 줄어들겠고, 아래는 몇가지 사례들과 개인적인 견해들.code review구글에서 code review 를 처음 배웠는데, (거의) 모든 코드가 아무에게나 보이고, 어지간하면 build & run 이 가능하고, change 를 보낼 수 있으며, repository owner 가 혹은 해당 reviewer 가 24시간 내에 응답이 오는 꽤 신기한 경험들이었다.언어 별 approver도 따로 있어서 readability 를 챙겨야 했고, owner 가 안된다고 하면 여러 가지 방법을 동원해서 어떻게든 되는 방법을 찾는 등 "LGTM"을 받기 위한 모든 노력이 여기 들어간다고 하겠다. 마침표, 약어 등의 영어로 흠이 잡혀 고생하던 경험, 그리고 그걸 이용해서 owner의 기분을 풀어주는 고급 기술, 대상 팀의 TODO 를 풀어주는 조건으로 code 를 짜 넣는 방법, 높은 사람들의 stamp 를 받아서 강제적으로 되게 하는 등의 여러 기억들이 지나간다.이 맥락에서는 '리뷰'라는 말을 떼어 놓고 생각해 본 적은 없고, 한글로도 딱히 번역될 만한 말이 없는 거 같기도 하다. 당시 구글의 코드는 지금의 용어들로는 극단적인 mono-repo, 잘게 잘려진 changes, approve based 강한 정책, 리뷰어로 되어 있었을 때의 강한 의무 등 바깥에 와 보니 굳이 저렇게까지 싶을 정도의 정책들이었지만, 개인적으로는 혹독한 process가 주었던 장점들을 좋아한다.document review팀을 옮겨 다니는 짬이 되면서 가장 신경이 많이 쓰이는 부분이 자연스럽게 문서들의 review에 대한 것들이겠다. 제품의 거대한 그림을 보여 주는 PRD , master design doc 같은 formal 한 문서들부터 작은 기능 별로 만들어진 약식 문서들, 실험 리포트들, one pager라고 불리는 짧은 design proposal 들까지... '운영'으로 갈 수록 필요가 많은 일들이긴 하겠다. 실제로 서른 넘어 배운 영어도 여기서 많이 늘었음은 틀림 없으리라.앞의 code change 의 경우, 남의 repository에 요청할 때 제일 먼저 듣는 이야기가 'design doc이 있느냐?' 였고, 대개 이 질문은 너의 아이디어를 sponsor / support 해 주는 높은 누군가가 있느냐 라는 질문이라 하겠다. Google Doc 에서 review , approve 기능이 은근히 유용했던 기억이고, 몇몇 팀에서는 아예 comment를 resolve 하는 것과 explicit 한 approve를 받아 오는 것을 review 과정의 일부로 놓기도 했고, 그 때문에 comment 를 남기는 행위와 허락 없이 resolve 하는 행위가 조금 적대적인 행위로 받아들여지는 부작용들도 있었다.approve stamp 를 찍어 주었으면 하는 높은 사람은 대개 다른 거 하느라 바쁘고, 문서 리뷰를 요청한 사람은 또 반대로 급하기에 begging 의 기술이 필요하기도 했고, 이 날을 위해서 평소에 잘 지내 놓거나 visibility를 높여 놓거나 하는 게 필요했다. 대면 출장의 용도도 여기서 가장 컸던 거 같다. 지나고 보니 그래도 제일 좋은 방법은 review 의 결과가 미치는 영향에 따라서 요청할 때 1) 그냥 한 번 봐 달라 혹은 2) 네 생각에는 A/B/C 중 어떤 게 나은 거 같니 3) 네가 approve 찍어 주면 고맙겠다. 며칠이면 되겠니? 등의 기대치를 아예 dry 하게 요청하는 것이었던 거같다. 역지사지...launch review구글에 다니면서 가장 짜릿하고 좋았던 경험들은 이 launch review 들에 있다. launchcal 이라 불렸고, 훗날 ariane 라 불리는 과제의 gatekeeping , explicit approval 에 해당하는 process 이고, 혹자는 agile , fast iteration 의 정반대에 있다고 해서 불편해 하는 시각이 있었던 과정이다. 다른 과제들을 읽음으로서 얻게 되는 장점도 훌륭하게 많았고, 매주 area leadership 들이 이를 운용하는 모습은 교과서에 닿아 있고, Google 의 respect others 에 가장 가까운 점이기도 하다.여기서는 모든 리뷰의 목표가 'appove' 에 있고, 어떻게 하면 approve 를 받을 수 있는가 에 대한 방법, timeline 등이 잘 정의되어 있었다. speed를 고려해서는 approve 를 optional 혹은 TBR 등으로 해 놓는 정도도 나쁘지 않았고, legal 을 제외한 나머지는 자기가 맡은 부분만 신경쓰는 것도 좋은 경험이었다. 예를 들면 검색팀의 경우 engineering 과 quality 가 담당자가 달랐어서 engineering 은 성능과 기계의 비용 등에 대한 점만 보고, quality는 사용자 실험 지표 등만 보고, 둘 다 UI 에 대해서는 맘에 안 들어도 내버려 둔다든지...개인적으로 agile / squad process 를 별로 좋아하지 않는데, 그 중 가장 큰 부분이 review 과정 자체를 생략하며 speed를 얻으려 하는 습관들 때문이다. 사람이 많고 여러 직군이 같이 하게 될 때 효용이 더 크겠지만, 테크 쪽은 어떻게든 그래도 코드가 들어가기 전에 비슷한 과정을 겪게 될테니까 부작용이 덜한데, 적어도 같은 직군의 다른 팀원들에게 도움 받는다는 생각으로 리뷰를 요청하는 건 규모와 상관없이 했으면 하는 생각이다. 여러 이유로 일단 내가 이걸 봐 달라고 하면 딴지부터 걸겠지..? 라는 선입견도 영향이 있을 수 있겠고, 서로 다른 squad 사이의 알력 같은 것도 쉽게 예상되긴 한다. 한국의 작은 회사들에 도입하려 했을 때 직접적인 피드백들은 불필요한 과정 추가로 인한 delay 우려 였고, 아이러니하지만, 나는 정 반대의 생각이고, 구글에서 event driven launch 들이 있었을 때 launch process가 가장 도움이 되었었던 사례들이 있다.아래는 추억 돋는 quality review.Search Quality Meeting: Spelling for Long Queries (Annotated)Quality 에 진심인 사람들의 치열한 리뷰 현장. Table 에는 stakeholder들, 병풍처럼 대기하는 과제 진행자들... 차례대로 기다리는...

교양한글영어용어

이용수

[인프런 워밍업 클럽 1기] BE 2일차 과제

[인프런 워밍업 클럽 1기] BE 2일차 과제문제 1구현 과정구현 목표 : 두 수를 입력해 요청하면 덧셈, 뺄셈, 곱셈의 결과를 반환하여 응답함.메서드 타입 : GET경로 : /api/v1/calc쿼리 파라미터 이름 : num1 / 타입 : int이름 : num2 / 타입 : intController 구현 - CalcController.javapackage com.group.libraryapp.controller.assignment.calc; import com.group.libraryapp.dto.assignment.request.CalculatorCalcRequest; import com.group.libraryapp.dto.assignment.response.CalculatorCalcResponse; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CalcController { @GetMapping("/api/v1/calc") public CalculatorCalcResponse calcTwoNumbers(CalculatorCalcRequest request ) { return new CalculatorCalcResponse(request); } }Request DTO 구현 - CalculatorCalcRequest.javapackage com.group.libraryapp.dto.assignment.request; public class CalculatorCalcRequest { private int num1; private int num2; public CalculatorCalcRequest(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public int getNum1() { return num1; } public int getNum2() { return num2; } }Response DTO 구현 - CalculatorCalcResponsepackage com.group.libraryapp.dto.assignment.response; import com.group.libraryapp.dto.assignment.request.CalculatorCalcRequest; public class CalculatorCalcResponse { private int add; private int minus; private int multiply; public CalculatorCalcResponse(CalculatorCalcRequest num) { this.add = num.getNum1() + num.getNum2(); this.minus = num.getNum1() - num.getNum2(); this.multiply = num.getNum1() * num.getNum2(); } public int getAdd() { return add; } public int getMinus() { return minus; } public int getMultiply() { return multiply; } } 서버 실행 후 Postman 결과 확인문제 2구현 과정구현 목표 : 날짜를 입력해 요청하면 해당 날짜 요일을 반환하여 응답함.메서드 타입 : GET경로 : /api/v1/day-of-the-week쿼리 파라미터 이름 : date / 타입 : LocalDate Controller 구현 - dayController.javapackage com.group.libraryapp.controller.assignment.day; import com.group.libraryapp.dto.assignment.response.DayOfTheWeekResponse; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; @RestController public class dayController { @GetMapping("/api/v1/day-of-the-week") public DayOfTheWeekResponse getDayOfWeek(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) { return new DayOfTheWeekResponse(date); } }Request DTO 구현 - DayOfTheWeekRequest.javapackage com.group.libraryapp.dto.assignment.request; import java.time.LocalDate; public class DayOfTheWeekRequest { private LocalDate date; public DayOfTheWeekRequest(LocalDate date) { this.date = date; } public LocalDate getDate() { return date; } }Response DTO 구현 - DayOfTheWeekResponse.javapackage com.group.libraryapp.dto.assignment.response; import java.time.LocalDate; public class DayOfTheWeekResponse { private String dayOfTheWeek; public DayOfTheWeekResponse(LocalDate date) { this.dayOfTheWeek = date.getDayOfWeek().toString(); } public String getDayOfTheWeek() { return dayOfTheWeek.substring(0, 3); } }서버 실행 후 Postman 결과 확인문제 3구현 과정구현 목표 : 여러 수가 입력된 배열을 입력해 요청하면 배열 내 수의 총합을 반환하여 응답함.메서드 타입 : POST경로 : /totalsum쿼리 파라미터 이름 : numbers / 타입 : ListController 구현 - TotalSumController.javapackage com.group.libraryapp.controller.assignment.totalsum; import com.group.libraryapp.dto.assignment.request.TotalSumRequest; import com.group.libraryapp.dto.assignment.response.TotalSumResponse; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class TotalSumController { @PostMapping("/totalsum") public TotalSumResponse getTotalSum(@RequestBody TotalSumRequest request) { return new TotalSumResponse(request); } }Request DTO 구현 - TotalSumRequest.javapackage com.group.libraryapp.dto.assignment.request; import java.util.List; public class TotalSumRequest { private List<Integer> numbers; public List<Integer> getNumbers() { return numbers; } }Response DTO 구현 - TotalSumResponse.javapackage com.group.libraryapp.dto.assignment.response; import com.group.libraryapp.dto.assignment.request.TotalSumRequest; public class TotalSumResponse { private int sum; public int getSum() { return sum; } public TotalSumResponse(TotalSumRequest request) { this.sum = request.getNumbers().stream().mapToInt(Integer::intValue).sum(); } }서버 실행 후 Postman 결과 확인 

백엔드인프런워밍업백엔드

이용수

[인프런 워밍업 클럽 1기] BE 1일차 과제

[인프런 워밍업 클럽 1기] BE 1일차 과제 [질문]Q. 어노테이션을 사용하는 이유 (효과) 는 무엇일까?  A. 어노테이션을 사용하는 이유에 대해 아래 내용에서 어노테이션의 정의, 특징, 역할, 장,단점에 대해 자료를 찾아 정리해보면서 나름대로 다음과 같은 결과를 도출 했다.어노테이션을 사용하면 코드와 설정을 같은 위치에 배치하여 코드의 가독성을 향상시킨다.클래스, 메서드, 필드, 파라미터 등과 관련된 정보가 함께 있어 코드를 읽고 이해하기 쉬워지며 특히, 코드의 흐름을 파악하기 쉬워진다.별도의 설정 파일을 작성하지 않고도 어노테이션을 사용하여 설정을 간소화할 수 있다. 이는 개발자가 코드에 직접 설정을 기술할 수 있으므로 설정 관리를 단순화시킨다.어노테이션을 통해 공통적인 코드 패턴이나 설정을 재사용할 수 있다. 이는 코드의 중복을 줄이고 효율적으로 코드를 작성할 수 있도록 도와준다.필요한 기능이나 제약 사항을 정의하기 위해 커스텀 어노테이션을 직접 정의할 수 있다. 이것은 프로젝트에서 특정한 요구사항에 대응하기 위해 유연하고 효율적인 방식으로 사용할 수 있다.어노테이션 프로세서를 사용하면 컴파일 시점에 어노테이션을 처리하고 검증할 수 있다. 또한, 코드를 자동으로 생성하거나 수정할 수 있어서 프로젝트에 필요한 기능을 효과적으로 구현할 수 있다. 어노테이션의 정의자바에서 어노테이션(Annotation)이란 소스 코드에 메타데이터를 추가하는 방법을 제공하는 기능이다. 어노테이션의 특징어노테이션은 컴파일러나 런타임 환경에게 정보를 전달할 수 있으며 전달된 정보는 코드를 실행하거나 컴파일할 때 사용된다.어노테이션은 @ 기호로 시작하며, 주석과 유사하게 생겼지만, 주석과는 달리 컴파일러가 읽고 처리할 수 있다.정의된 어노테이션은 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다.        어노테이션의 역할컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.런타임에 특정 기능을 실행하도록 정보를 제공한다.  어노테이션 사용의 장점코드의 가독성 향상어노테이션은 코드와 설정을 같은 위치에 배치하므로 읽고 이해하기 쉽다. 클래스, 메서드, 필드, 파라미터 등 연관된 코드와 가까이 있기 때문에 흐름을 따라가기 쉽다.설정의 간소화별도의 설정 파일 작성 없이 어노테이션 적용을 통해 설정을 간소화할 수 있다.중복 코드 제거공통적인 코드 패턴이나 설정을 재사용할 수 있기 때문에 코드의 중복을 줄이고 효율적으로 코드를 작성할 수 있다.커스텀 어노테이션 정의직접 커스텀 어노테이션을 정의함으로 필요한 기능이나 제약 사항을 정의하여 사용할 수 있다.프로세서를 통한 검증 및 코드 생성어노테이션 프로세서를 이용해 컴파일 시점에 어노테이션을 처리하고 검증할 수 있다. 또한 코드를 자동으로 생성하거나 수정할 수 있기에 효과적으로 기능을 구현할 수 있다. 어노테이션 사용의 단점런타임 오버헤드런타임 시점에 리플렉션을 사용하여 처리하는 어노테이션의 경우 성능상의 오버헤드가 발생할 수 있다.컴파일 시점 제한어노테이션도 컴파일 시점에 오류를 확인할 수 있지만, 어노테이션 로직이 런타임에 에러를 발생시키거나 어노테이션에 잘못된 값이 할당된 경우 컴파일 시점에 오류를 확인할 수 없을 수도 있다. 어노테이션의 종류어노테이션은 크게 세 가지로 구분된다. 자바에서 기본적으로 제공하는 빌트인 어노테이션과 어노테이션을 정의하는 데 사용되는 메타 어노테이션, 마지막으로 사용자 어노테이션이 있다. 빌트인 어노테이션자바에서 기본적으로 제공하는 어노테이션이다.@Override : 컴파일러에게 메서드를 오버라이딩하는 것이라고 알린다.@Deprecated : 앞으로 사용하지 않을 대상임을 알린다.@FunctionalInterface : 함수형 인터페이스라는 것을 알린다.@SuppressWarning : 컴파일러가 경고 메시지를 나타내지 않는다.@SafeVaragrs : 제네릭과 같은 가변 인자의 매개변수를 사용할 때의 경고를 나타내지 않는다. 메타 어노테이션어노테이션에 붙이는 어노테이션으로, 어노테이션을 정의하는 데 사용한다.@Target : 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용한다.@Documented : 어노테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.@Inherited : 어노테이션이 하위 클래스에 상속되도록 한다.@Retention : 어노테이션이 유지되는 기간을 정하기 위해 사용한다.@Repeatable : 어노테이션을 반복해서 적용할 수 있도록 한다. 사용자 정의 어노테이션사용자가 직접 정의하여 사용하는 어노테이션이다. Q. 나만의 어노테이션은 어떻게 만들 수 있을까? A. 사용자가 직접 여러 어노테이션을 혼합하거나 정의하여 어노테이션을 만들 수 있다.기본적으로 인터페이스를 정의하는 것과 유사하며 @interface 뒤에 사용할 어노테이션의 이름을 정의하고 속성을 설정한다.어노테이션을 정의할 때 기본적으로 포함되야할 메타 어노테이션이 존재한다.@Retention - 어노테이션이 유지되는 기간을 정해야 하며 다음과 같은 열거 상수 중 선택한다.SOURCE : 컴파일할 때 적용 ~ 컴파일된 후에 제거됨CLASS : 메모리로 로딩할 때 적용 ~ 메모리로 로딩된 후에 제거됨RUNTIME : 실행할 때 적용 ~ 계속 유지됨@Target - 어노테이션을 정의할 때 적용 대상을 지정해야 하며 다음과 같은 열거 상수 중 선택한다.TYPE : 클래스, 인터페이스 열거타입ANOTATION_TYPE : 어노테이션FIELD : 필드CONSTERUCTOR : 생성자METHOD : 메서드LOCAL_VARIABLE : 로컬 변수PACKAGE : 패키지 이제 예를 들어 @MyAnnotion이라는 String 속성을 가진 어노테이션을 정의해보겠다.import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 사용자 정의 어노테이션 선언 @Retention(RetentionPolicy.RUNTIME) // 어노테이션 정보를 유지할 시점 (런타임까지 유지) @Target(ElementType.METHOD) // 어노테이션이 적용될 대상 (메서드에 적용) public @interface MyAnnotation { String value() default "test"; // 어노테이션의 속성, 기본값은 빈 문자열 // 추가적인 속성이 필요하다면 여기에 선언할 수 있습니다. }정의한 어노테이션에 사용한 메타 어노테이션은 다음과 같다.@Retention(RetentionPolicy.RUNTIME): 어노테이션 정보를 런타임까지 유지한다는 것을 의미하며 이렇게 하면 실행 중에 리플렉션(reflection)을 사용하여 어노테이션 정보를 읽을 수 있다.@Target(ElementType.METHOD): 이 어노테이션은 메서드에만 적용하도록 설정한다. 이제 메인 코드에서 어노테이션을 사용하고 리플렉션을 통해 어노테이션의 정보를 출력해보자.public class Main { @MyAnnotation public void myMethod() { System.out.println("This is myMethod"); } public static void main(String[] args) throws Exception { Main example = new Main(); example.myMethod(); // 리플렉션을 이용하여 어노테이션 정보 출력 java.lang.reflect.Method method = Main.class.getMethod("myMethod"); MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); System.out.println("Method name: " + method.getName()); System.out.println("Annotation value: " + annotation.value()); } }어노테이션의 이름과 속성 값을 출력하는걸 확인할 수 있다."C:\Program Files\Java\jdk-11.0.16.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.1\lib\idea_rt.jar=6433:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\User\Desktop\test\out\production\test Main This is myMethod Method name: myMethod Annotation value: test Process finished with exit code 0참고 자료[Spring] 스프링을 어노테이션 기반으로 만든 이유 (tistory.com)[Java] Custom Annotation(커스텀 어노테이션) 만들기 - MangKyu's Diary (tistory.com) 

백엔드인프런워밍업백엔드