블로그

miiro

[인프런 워밍업 스터디 클럽 1기] BE 2주차 회고록

두 번째 발자국자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고인프런 워밍업 클럽에 참여하여 쓰는 두 번째 회고록입니다.학습 내용static이 아닌 코드를 사용하려면 인스턴스화를 해야합니다.하지만, 학습에서 진행했던 UserController는 jdbcTemplate를 의존하여 사용하고 있습니다.이를 가능케 하는 것은 @RestController 어노테이션으로 의해 의존이 가능해지고 해당 클래스를 스프링 빈으로 등록시킵니다. 스프링 빈서버가 시작되면, 스프링 서버 내부에 거대한 컨테이너를 만듭니다.해당 컨테이너 안에는 클래스가 들어가게 되고, 다양한 정보(이름, 타입) 도 함께 들어가고, 인스턴스화도 이루어집니다.서버가 시작되면 코드의 구현 순서에 대해 살펴보겠습니다.스프링 컨테이너(즉, 클래스 저장소)가 시작됩니다.기본적으로 생성되어있는 스프링 빈들이 등록됩니다.사용자가 설정한 스프링 빈이 등록됩니다.필요한 의존성이 자동으로 설정이 됩니다. 여기서 스프링 컨테이너를 사용하는 이유를 살펴보면 2가지의 스프링 프레임워크의 특성 때문입니다.첫 번째는 제어의 역전(IOC) 이다. 말 그대로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌, 외부(스프링 컨테이너)에서 결정되는 것을 의미입니다. 객체의 의존성을 역전시켜 객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 해서 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있도록 도와줍니다.두 번째는 의존성 주입(DI) 로 객체를 직접 생성하는 것이 아닌 외부에서 생성할 후 주입시키는 방식을 의미한다.이를 통해 모듈 간의 결합도가 낮아지고 유연성을 높일 수 있습니다.  스프링 빈으로 등록하는 방법여기서 중점적으로 사용하는 어노테이션에 대해 살펴보겠습니다. @Configuration클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Bean메서드에 붙이는 어노테이션메서드에서 반환되는 객체를 스프링 빈에 등록한다.외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Service, @Repository개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때 사용한다.@Component주어진 클래스를 컴포넌트로 간주한다.해당 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다. @Component 사용컨트롤러, 서비스, 레포지토리 X개발자가 직접 작성한 클래스를 스프링 빈으로 등록 시에 사용되기도 한다. 스프링 빈 주입 방법생성자를 활용하여 주입하는 방법setter와 @Autowired를 사용하는 방법필드에 직접 @Autowired를 사용하는 방법 JPA(Java Persistence API)데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙영속성 : 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성 ORM(Object-Relational Mapping)객체와 관계형 DB의 테이블을 짝짓는 방법HibernateJPA를 구현(implement)해서 코드로 작성한 구현체내부적으로 JDBC를 사용한다   JPA 어노테이션@Entity : 스프링이 객체와 테이블을 같은 것으로 바라본다.Entity 뜻 : 저장되고, 관리되어야 하는 데이터@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;@Id : 위 필드를 primary key로 간주@GeneratedValue : primary key는 자동 생성되는 값GenerationType.IDENTITY : MySQL의 auto_increment 전략과 매칭JPA를 사용하기 위해서는 기본생성자가 꼭 필요하다 @Column(nullable = false, length = 20, name = "name") private String name;@Column : 객체의 필드와 Table의 필드를 매칭한다.null 여부, 길이 제한, DB Column 이름 등을 사용@Column 어노테이션을 생략할 수도 있다.  트랜잭션(Transaction)쪼갤 수 없는 업무의 최소 단위 모든 SQL 한번에 성공 or 하나라도 실패하면 모두 실패 트랜잭션 명령어start transaction; : 트랜잭션 시작하기commit; : 트랜잭션 정상 종료(SQL 반영)rollback; : 트랜잭션 실패 처리(SQL 미반영)   트랜잭션 적용 방법@Transactional public void saveUser(UserCreateRequest request) { userRepository.save(new User(request.getName(), request.getAge())); }SELECT 쿼리만 사용한다면 readOnly 옵션 사용 가능@Transactional(readOnly = true) public List<UserResponse> getUsers() { return userRepository.findAll().stream() .map(UserResponse::new) .collect(Collectors.toList()); } ❗ 주의사항IOException 과 같은 Checked Exception은 롤백이 일어나지 않는다. 영속성 컨텍스트테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료특징변경 감지(Dirty Check)영속성 컨텍스트 안에 불러와진 Entity는 명시적으로 save 하지 않더라도, 변경을 감지해 자동으로 저장된다.@Transactional public void updateUser(UserUpdateRequest request) { User user = userRepository.findById(request.getId()) .orElseThrow(IllegalArgumentException::new); user.updateName(user.getName()); }쓰기 지연DB의 insert/update/delete SQL문을 바로 날리는 것이 아닌, 트랜잭션이 commit될때 모아서 1번만 날린다.1차 캐싱ID를 기준으로 Entity를 기억한다.캐싱된 객체는 완전히 동일하다.(객체 주소도 같다) JPA 연관관계ex) 사람(person)과 실거주 주소(address)사람 1명은 1개의 실거주 주소만을 가지고 있다.@OneToOne연관관계의 주인을 설정한다.(mappedBy 사용한다.)연관관계의 주인 효과상대 테이블을 참조하고 있으면 연관관계의 주인이다.연관관계 주인이 아니면 mappedBy 사용연관관계의 주인의 setter가 사용되어야만 테이블이 연결@Transactional public void savePerson() { Person person = personRepotiory.save(new Person()); Address address = addressRepotiory.save(new Address()); person.setAddress(address); } 연관 관계의 주의점트랜잭션이 끝나지 않았기에, 한 쪽만 연결해두면 반대쪽의 값은 알 수 없다. @Transactional public void savePerson() { Person person = personRepotiory.save(new Person()); Address address = addressRepotiory.save(new Address ()); person.setAddress(address); System.out.println(address.getPerson); //null 반환 }이를 방지하기 위해 setter 한 번에 둘을 같이 이어준다.public void setAddress(Address address) { this.address = address; this.address.setPerson(this); } 다대일,일대다관계@ManyToOne을 단방향으로 사용할 수 있다.@JoinColumn연관관계의 주인이 활용할 수 있는 어노테이션필드의 이름이나, null 여부, 유일성 여부, 업데이트 여부 등을 지정할 수 있다.다대다관계(N : M 관계)@ManyToMany구조가 복잡하고, 테이블이 직관적으로 매핑되지 않기 때문에 사용하지 않는 것을 지양한다.cascade 옵션한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러서 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능orphanRemoval 옵션객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션 @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<UserLoanHistory> userLoanHistories = new ArrayList<>();지연 로딩(Lazy Loading)연결되어 있는 객체를 꼭 필요한 순간에 데이터를 로딩한다. @OneToMany의 fetch() 옵션 연관관계의 장점각자의 역할에 집중하게 된다.새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.테스트 코드 작성이 쉬워진다.연관관계 사용 시 주의 사항지나치게 사용하면 성능 상의 문제가 발생할 수 있다.도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.요구 사항 등 여러 부분을 고민해서 연관 관계 사용을 선택해야한다. 과제 내용Day 4Day2에서 진행했던 GET API와 POST API를 구현했었는데, 그 당시에는 database를 사용하지 않은 방법으로 과제에서 주어진 조건에 맞게 답을 출력했었습니다. 이번 과제에서는 DB를 활용하여 정보를 저장하고, 수정할 수 있는 로직을 구현해야했습니다.Layer를 분리해서 진행을 할 수 있지만, 간단하게 문제의 답만 도출하기 위해서 Controller Class에 구현을 진행했었습니다.그렇기 때문에 Spring Data JPA가 아닌 JDBCTemplate를 활용하여 진행했습니다. JPA를 통한 DB 로직을 구현하는 것만 주구장창 했어서, 직접 쿼리문을 작성해서 진행하는 JDBCTemplate를 사용하는 방법에 대해 알 수 있었던 거 같습니다.📋 4일차 미션 : GET API와 POST API 구현 Day 5클린 코드는 코드를 아름답게 만드는 것이 아닌 코드의 질을 향상 시키는 데 중요하다는 것을 알았습니다.클린 코드를 구현하기 위해서 명확하고 간결하게 코드를 구현하여 버그를 줄이고, 그로 인한 개발 속도를 향상시킬 수 있습니다.또한, 잘 작성된 코드는 시간이 흘러도 이해하기 쉽기에, 유지 보수가 간편합니다. 이로 인해 개발자로서 팀 프로젝트를 진행할 시에팀 커뮤니케이션을 원활하게 진행할 수 있도록 도움을 줄 수 있다는 것을 알게 되었습니다.📋 5일차 미션 : 클린 코드 구현  회고스프링 프레임워크의 핵심 개념인 제어의 역전(IOC)과 의존성 주입(DI)을 통해 더 나은 코드 작성과 유지 보수의 용이섬에 대해 알게 되었습니다. 또한 어노테이션들을 활용하여 클래스를 스프링 빈으로 등록하고, 스프링 컨테이너가 이를 관리함으로써, 필요한 의존성을 자동으로 설정할 수 있다는 사실을 배웠습니다. JPA를 통한 데이터의 영속성 관리와 ORM을 통한 객체와 DB의 매핑에 대해 이론적으로 정립할 수 있는 계기되었던 거 같습니다.서비스를 구성하는 데 가장 중요한 @Transactional 어노테이션을 사용하여 데이터의 일관성을 유지하는 방법을 쉽게 공부하면서 더티 체크, 쓰기 지연 등 특성에 대해 알 수 있었던 거 같습니다.객체와 DB를 효과적으로 설계할 수 있도록 연관관계를 설계하는 방법을 배움으로써 사용할 때의 주의사항과 성능 문제를 방지하기 위한 전략에 대해 알게 되면서 이를 통해 효과적이고 용이한 애플리케이션 개발을 할 수 있는 토대를 마련할 수 있었던 거 같습니다.  

백엔드인프런워밍업스터디클럽2주차회고록

90년대 컴퓨터 공학 이야기 (2) — 컴퓨터 공학과

다행히 수험생 시절 공부를 꽤 열심히 해서 과를 골라서 지원할 수 있는 상황이 되었고, 더 많은 운을 기대하며 자연스럽게 컴퓨터가 들어가는 과를 찾아 지원하였는데, 관련된 이야기 몇 가지…컴퓨터 공학 vs 전자계산기공학원서 접수 시 무의식적으로 다른 과 대비해서 과 이름이 멋지다는 생각을 했었다. 10대의 마음에 아마 과의 이름이 예전의 전자계산기공학이었으면 지원을 하지 않았을 것이다. 당시 한국의 입시 제도는 학교와 과를 먼저 선택하고 주어지는 경쟁률에 따라 시험 성적으로 우열을 매기는 개인적인 생각으로는 당일의 운이 매우 중요했던 기억이다.과 연혁을 보면, 1978년에 전자계산기공학과 줄여서 전산기공으로 불렸었다 한다. 당시 국립대의 학과 이름에 영어를 쓸 수 없던 규칙이 있었더랬고, 1988년 올림픽을 지나면서 조례가 바뀌어 영어 이름이 과에 허락이 되었고, 컴퓨터공학으로 바뀌었다고 한다. 당시 이 혜택을 받은 과가 컴퓨터공학과와 산업디자인학과, 두 과 모두 이름의 버프를 받아서 당분간 각 단과대의 대표주자가 되었다고 한다. 몇 년 위 선배들은 2지망으로 의대를 내려 보내기도 하고 전체 수석 선배님도 계셨더랬다.컴공 ? 전전제 ? 전산 ?당시 입시 정보로 컴퓨터를 만지려면 갈 수 있는 과는 아래의 세가지,공과대학 컴퓨터공학과 — 정원 75명공과대학 전기전자제어공학과군 — 정원 270명자연과학대학 계산통계학과 전산과학전공 — 정원 30명 소위 과 이름의 ‘간지’를 찾아서, 그리고 적당한 인원(?)이 끌려 지원을 했고, 아마도 증원 ( 60 → 75 ) 의 혜택으로 합격을 했던 거 같다. 흐릿한 정보로 소프트웨어와 하드웨어 둘을 반반씩 하려면 컴퓨터공학이 맞다고 하였고, 전전제의 경우 2:8 , 전산과의 경우 9:1 의 비율이 소프트웨어와 하드웨어의 비율이라 했었다.과 이름이 주는 오해도 나름 상당해서 게임을 만들고 싶어 했던 신입생 후배들이 여기가 아닌가 해서 실망해 하던 기억들과 각종 올림피아드에서 날고 기던 아이들이 시대에 뒤떨어진 교수님이라며 불평을 하던 시기도 금방 왔었다. 대학 생활 중에 인터넷, PC 통신, 스타크래프트까지, 삐삐에서 핸드폰까지, 지금 돌이켜 보면 아이폰 빼고 모든 일이 벌어진 세상이었으니 그 와중에 어떤 역할을 잡았어야 하나 모두가 고민 많았었던 시기였으리라.컴퓨터 공학부1999년 석사 졸업하던 해까지 나는 영향이 없었지만 이후 다양한 학부 대학원의 통폐합이 있었고, 우여곡절 끝에 지금은 자연대의 전산과와 합쳐서 컴퓨터공학부로 정리되어 왔다 ( https://cse.snu.ac.kr/greetings ). 위의 30명 전산과 동기들과 졸업 후 동문이 되었지만, 접점이 없던 탓에 사회에서 한 번씩 만나도 많이 서먹하긴 하다. 나이가 꽤 들고 멀리서 고생을 좀 하고 나서는 뭐 많이 둥글둥글해 진 것도 사실이겠다.

교양컴퓨터공학90년대

낌밤

UXUI 디자이너를 위한 무료 애니메이션 툴 'phase' 사용기

독일&대만 애니메이션 툴이 한국에 첫 번째로 론칭했다는 소식을 듣고 바로 사용해보았다.직접 사용해보고 느낀점 들을 정리 해보았다. 📌 쉽고 익숙한 인터페이스인터페이스가 figma와 유사하고, 기타 디자인 툴을 사용해본 사람은 바로 느낌이 오는 인터페이스.레이어창이나 디자인 패널의 위치가 너️무 익숙해서 한번에 슉슉 찾아서 실행해 볼 수 있었다.그래서 배우기도 더 쉽겠다고 느꼈다. 📌 무료로 이용가능한 툴 ⭐⭐⭐⭐⭐어도비, 피그마, Open AI 등 디자인을 위해 이미 구독하고 있는게 많아 걱정됐는데, 무료 체험판이 아닌 전 기능을 무료로 이용할 수 있었다. 무료 애니메이션 툴이라고 퀄리티가 낮은 것도 아니었고,여느 애니메이션 툴과 비교해도 퀄리티 높은 결과물을 만들 수 있는게 정말 큰 장점이었다 📌 웹기반 ⭐⭐⭐⭐⭐ (협업 + 용량)웹기반 애니메이션 툴이여서 공동 작업자를 초대해서 한 화면에서 작업할 수 있었다.피그마처럼 히스토리 + 코멘트 기능까지 있어 협업에도 최적화 되었구나~ 하고 느꼈다.플래시부터 에펙까지 다 써온 나로써 웹기반 클라우드로 파일 저장이나 용량 부담없는 것 또한큰 장점으로 다가왔다. 📌 한국 튜토리얼과 안내한국이 첫 릴리즈여서 그런지 한국어 대응이 잘되어있다고 느꼈다.홈페이지에서 확인할 수 있는 공식 튜토리얼은 모두 한국어로 진행되고 있고 한국 공식 sns나 채팅방을 운영해서 바로 물어보고 답변받기 좋았다. 📌 간편한 핸드오프작업물을 개발자에게 핸드오프하기 용이했다. json파일로 추출이 되니 바로 전달하면 되고, mp4나 gif같은 일반 애니메이션 확장자로도 추출가능하니 필요에 맞게 사용하면 된다. phase가 궁금한 분들은 홈페이지에서 확인해봐도 좋을 것 같다. https://zrr.kr/vAgZ홈페이지에 들어가니 이벤트도 진행하고 있었다. 애니메이션 제작 챌린지를 통해 총 558만원 상금도 준다.1등이 270만원! 내꺼다!!! 

애니메이션모션그래픽UXUI

전재민

[인프런 워밍업 스터디 클럽 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워밍업클럽디자인시스템볼드피그마워밍업스터디

상은/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) 

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

한국 IT 용어 이야기 (3) - "R&R"

여러 직군의 사람들과 일을 하게 되었을 때, 애자일/스프린트/회고/리뷰 등으로 이런 저런 일들을 진행하게 될 때 듣게 되었던 단어 중에 생소한 것으로 "R&R"이 있었다. 스쳐 지나듯 오갔던 말이어서 한글로 "알앤아ㄹ" 혹은 "아래날" 정도로 들려서 꽤 오랫동안 'arena' 를 이야기하는 줄 알고 있었다. 'arena' 는 발음으로는 '어리나'에 가깝지만, 한국에서는 '아레나' 라고 듣고 자라 왔었기에 한데 모여 전투적으로 열심히 일하자는 이야기겠구나 생각했었는데, 사실은 정반대의 의미를 가진 단어였던 셈이었다.참고로 구글, 바드, 웹스터 등에 R&R 을 물어보면 Rest & Recreation 을 알려 주는데https://www.merriam-webster.com/dictionary/R%20%26%20R여기에 한글로 '뜻'이라 물어 한국어를 섞어 주면 IT 용어들로 쏠려서 결과들이 몰려 온다. 관련업에 종사하긴 하지만, 한국어 컨텐츠가 쏠려 있는 거 같아 조금 씁슬해 진 부분도 있겠다.https://www.google.com/search?q=R%26R+%EB%9C%BB알앤알 뒤에 붙는 단어들로는 '정리하다', '구분하다'가 많이 오고, 비슷한 문맥에 '업무분장'이라는 이름의 단어도 종종 등장한다. 업무분장은 job assignment , task assignment 등에 더 가깝다 하겠다.몇몇 기억들주로 여럿이 모여 일을 같이 하면서 혹은 나누어 하게 될 때 '선을 긋는' 용도로 자주 쓰였던 기억이다. 팀간에 혹은 멤버들 간에 가벼운 텐션이 있게 될 경우 나는 여기까지만 할 거고 그쪽에서 나머지는 알아서 하라 정도의 거리 두기 용으로 ...프로젝트 단위 보다는 조직도 같이 큰 그림에서 이해하기에 괜찮은 개념들이긴 하지만, 뭔가 훨씬 더 규모가 큰 곳들 - 영업망 업권 할당 같은 - 에서 쓰이는 게 좋은 개념이 과하게 스타트업씬에 내려와 있는 게 아닐까 싶었다. 특히 'responsibility' 부분은 과제에 적용시키기 어렵다는 생각인데, 실제로 '책임을 진다'는 게 어떤 의미인가에 대해 딱 떨어지는 그림이 나오진 않았고, 이는 내가 각종 툴의 "assigned" 상태에 익숙해져 있는 bias 가 있다 하겠다.아이러니하게 구글에 다니면서는 한 번도 써 보지 않은 단어였고, 그래서인지 개인적으로 개발 조직 내에서는 적어도 선을 그으면 안 된다는 생각이다. 잘 풀릴때는 뭐 별 문제 없지만, 왠지 과제가 삐걱거릴 때 무의식적으로 선을 긋는 습관이 여기서 온 거 같다는 생각이고, 몇몇 경우 개인들과 조직의 성장을 막는 요소로 작용하고 있지 않았나 하는 생각이다. 예를 들면 '나는 프론트엔드 엔지니어니까 백앤드는 고치면 안돼' 같은..선을 긋고 기본 자세가 방어적인 데서 시작을 하는 팀들과 복잡한 일을 해 나갈 때, 자연스레 비는 부분에 대해 책임 소재가 불분명해져서 종종 어려운 일들이 생겼다. 사람 수가 일감의 수보다 부족한 거의 모든 스타트업 씬에서는 특히 자주 일어나는 일인데, 새로운 영역의 일이거나 몇몇 팀들의 사이에서 겹치거나 비거나 하는 경우 자발적으로 알아서 챙겨 지면 좋으련만.. 이걸 잘 나누어서 일이 되게 잘 시키는(?) 것도 PM 이나 리더십의 R&R 이라 생각할 수도 있겠다.

교양용어개발자한국어

한국 IT 용어 이야기 (2) - 정합성

두번째로 챌린징했던 단어는 '정합성'이다. PM / design 쪽에서 이야기는 많이 듣지 못했지만, data 직군과 DBA , DevOps 들과 이야기할 때 종종 나왔던 단어이다.일단 네이버 사전에서 정합성은 무슨 말인지 못 알아들을 정도의 설명인데, 단지 뒤에 '체크'라는 말이 붙으면서 조금 알아들을 수 있는 용어로 바뀌게 된다.네이버 사전 결과 '정합성'30년 전에 데이터베이스 과목을 수강한 후에 실무 일머리들은 영어로 다시 다 배웠기에 여러 가지 용어들을 두리뭉실하게 써 왔는데, 여기서 잠깐 ChatGPT 와 bard 의 이야기 먼저...ChatGPT 의 결과 - "데이터 정합성을 영어로"bard 의 결과 - "데이터 정합성을 영어로"일단 책에서 배운 개념으로 data consistency 와 data integrity 가 꼬이기 시작했고, 한글로 적당한 '데이터 무결성'이 생각이 났다. 이를 비교하려 다시 물어 보니 이제 bard 랑 chatGPT 가 비슷한 말을 하게 되는 거 같았다.ChatGPT - 데이터 무결성과 데이터 정합성 비교bard - 데이터 무결성과 데이터 정합성 비교아래는 배웠던 대로 이해하고 동작하는 (쉬운) 예제들.database migration 작업을 하는데, 새로 생성된 테이블의 entry 개수가 이전 table 의 개수와 다르다.. --> 두 테이블의 정합성이 맞지 않아 AWS DMS 를 다시 시도한다든지...database , table 안에 끊어진 reference 들이 있고, deprecated 된 table 때문에 의미 없는 필드들이 더 생기게 되었다. --> data 무결성이 깨지는 상황으로 batch 잡을 돌려서 null 로 채우자.. 조금 난이도가 있는 사례로는소스로 삼는 raw table 이 여러 곳에서 동시에 사용되는 derived table 을 만들게 되는데, 같은 날 생성된 다른 두 테이블의 같아야 할 값이 다르더라. --> 두 테이블 사이에 필드들이 정합성이 다르다. freezing 되어 있는 테이블을 써라.. 그런데, 위의 bard 의 번역처럼 다양한 의미를 두리뭉실하게 '정합성'이라는 말에 기대어 쓰는 경우들이 종종 있었다. 뭔가 딱히 깊이 설명하고 싶지 않지만, 보이는 데이터를 바로 쓰기 찜찜할 때 '정합성' 이 거론되었고, 사실 이 단어 뒤에 들어오게 될 동사를 고르는 것도 꽤 어려운 일이다. '맞지 않다' , '깨져 있다', '좋다 or 나쁘다'. '완벽하다', '쓸만하다?'가장 어려웠던 사례로는Google Analytics 가 주는 MAU, Firebase 가 주는 MAU , Amplitude 가 주는 MAU 가 다른데, 데이터 정합성이 의심되니 쓰던 걸 쓰도록 하겠다. or vice versa실험을 돌려 지표가 나왔는데, 정합성에 이슈가 있어서 다시 하기로 했다. 이 '정합성'이라는 말은 '무결성'에 비해 조금 과하게 넓게 쓰이고 있는 게 아닐까 하는 생각이었고, 이 일본식 한자들은 딱히 정이 가지 않기도 해서 어느 새 지나 보니 시간 될 때마다 영어 표기를 권하는 꼰대가 되어 있었다.

교양용어개발자한국어