mygoaway의 등록된 링크

 mygoaway로 등록된 네이버 블로그 포스트 수는 50건입니다.

[Spring] Spring Batch 청크 프로세스 이해 [내부링크]

기존에 스프링 배치에 대해서 정리한 내용은 기본적인 환경설정에 대한 내용과 간단하게 Job, Step을 생성해서 진행해봤는데, 최근 업무를 하다가 청크(Chunk) 기반의 스프링 배치를 진행해야 하는 상황이 생겨서 스프링 배치 - 청크 프로세스에 대해서 정리해보는 시간을 갖었다. 기반 내용은 아래 인프런 강의를 듣고 정리하였다. https://www.inflearn.com/course/스프링-배치/dashboard 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch - 인프런 | 강의 초급에서 중~고급에 이르기까지 스프링 배치의 기본 개념부터 API 사용법과 내부 아키텍처 구조를 심도있게 다룹니다. 그리고 스프링 배치 각 기능의 흐름과 원리를 학습하게 되고 이를 바탕으로 다양한 배치 어플리케이션 개발을 위한 실무적 감각을 익히게 됩니다., - 강의 소... www.inflearn.com 우선, 청크(Chunk)란 여러 개의 아이템을 묶은 하나의 덩어리, 블

[Spring] JaCoCo 적용하기 [내부링크]

현재 담당하고 있는 업무에서 코드 커버리지(Code Coverage) 분석 도구인 JaCoCo를 적용해야하는 상황으로 JaCoCo를 개인 프로젝트에 적용하여 사용 방법을 익혔으며, 익힌 내용을 정리해 볼 생각이다. 우선, JaCoCo를 설명하기 전에 코드 커버리지(Code Coverage)가 무엇일까? - 코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나입니다. 테스트를 진행하였을 때 '코드 자체가 얼마나 실행되었느냐'는 것이고, 이는 수치를 통해 확인할 수 있습니다. 코드 커버리지는 소스 코드를 기반으로 수행하는 화이트 박스 테스트를 통해 측정되며, 화이트 박스 테스트란 개발자 관점의 단위 테스트 방법입니다. 코드 커버리지 분석 도구는 코드 커버리지를 개발자가 직접 확인하지 않고 분석할 수 있도록 도와주는 도구이며 자바 코드 커버리지 분석 도구는 여러가지가 존재하지만 대표적인 것인 JaCoCo입니다. 코드 커버리지에 대한 자세한 설명은 아래

[Spring] 스프링 부트 시큐리티 - 04. 토큰(Token)기반 인증에 대한 소개 [내부링크]

지금까지 사용자 정의 로그인 / 구글, 네이버 등을 통한 회원가입과 로그인을 구현해봤는데 위와 같은 방법을 통해서 하는 경우 이전 글에서도 알 수 있듯이 시큐리티 세션 내 Authentication 객체에 사용자 정보와 권한 등이 담겨져서 서버에서는 해당 세션을 통해 사용자 정보와 권한 등을 알 수 있었다. 위와 같은 인증 시스템의 흐름을 보자면 아래와 같다고 할 수 있습니다. 서버 기반 인증의 문제점은 아래와 같습니다. 세션 : 유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 해야합니다. 이를 세션이라고 부릅니다. 대부분의 경우엔 메모리에 이를 저장하는데, 로그인 중인 유저의 수가 늘어난다면 어떻게 될까요? 서버의 램이 과부화가 되겠지요? 이를 피하기 위해서, 세션을 데이터베이스에 저장하는 방식도 있지만 이 또한 유저의 수가 많으면 데이베이스의 성능에 무리를 줄수 있습니다. 확장성 : 세션을 사용하면 서버를 확장하는 것이 어려워집니다. 여기서 서버의 확장이란, 단순히 서버의

[Spring] 스프링 부트 시큐리티 - 05. OAuth 2.0 기반의 인증 Resource Owner Password Credentials 기반의 인가 방식 [내부링크]

이 전 시간에는 기존 스프링 시큐리티 세션의 문제로 Token 기반의 인증 방식을 택해야 한다고 정리를 해봤습니다. 1. 인증과 인가의 필요성 : 대부분의 서비스는 인증과 리소스에 대한 인가 기능이 필요한데, 인증과 인가 기능은 스프링 시큐리티를 통해서 제어가 가능하지만 OAuth를 통해서 가능합니다. 이 전에 구글과 네이버 로그인을 통해서 살펴본것 처럼 우리의 애플리케이션 서버와 구글/네이버 서버와 통신을 할 때 Access Token을 통해 통신을 한것과 같은 이치입니다. OAuth는 서버와 클라이언트 사이에 인증을 완료하면 서버는 클라이언트에게 Access Token을 전송합니다. 클라이언트는 Access Token을 이용해서 접근 및 서비스를 요청할 수 있습니다. 서버는 Access Toekn 기반으로 서비스와 권한을 확인하여 접근을 허용할지 말지를 결정하고, 결과 데이터를 클라이언트에게 보내줍니다. 서버는 Access Toekn을 기반으로 클라이언트를 확인하여 서비스하기 때

[Refactoring] 코딩으로 학습하는 리팩토링 1일차 [내부링크]

하나의 프로젝트를 여러명의 BE 담당자들과 함께 업무를 하다보니, 다른 담당자가 작성한 코드들을 많이 볼 수 있으며 내가 작성한 코드들 또한 다른 담당자들이 보는 경우가 많다. 현재 회사의 경우에는 대부분의 BE 개발자분들이 나보다 경력이 한참 높기 때문에 다른 개발자분들이 작성한 코드들을 보면 "어떻게 이런식으로 코드를 간결하게 작성할까?"라는 생각이 많이 들었다. 그래서 리팩토링에 대해서 많은 생각을 하고 있던 와중에 인프런에서 개발자라면 무조건 읽어야 하는 필독 도서인 "리팩토링"에 대해서 자바 코드 예제로 보다 쉽게 설명해주는 강의를 발견해서 듣기로 결정하였다. 사실, 해당 강의를 통해 팀내 다른 개발자들처럼 코드를 작성하는 것이 쉽지는 않겠지만 하루 하루 조금씩 방법들을 익혀간다면 그래도 조금은 (덜?) 챙피하지 않을까? 라는 마음으로 강의를 들어 볼 예정이다. 우선, 리팩토링(Refactoring)이란 무엇일까? - 리팩토링은 소프트웨어 행동(기능)은 유지하면서 내부 구조

[Refactoring] 코딩으로 학습하는 리팩토링 2일차 [내부링크]

냄새 3. 긴 함수 짧은 함수 vs 긴 함수 - 짧은 함수는 더 많은 문맥 전환을 필요로 한다 vs 함수가 길 수록 더 이해하기 어렵다. - "과거에는" 작은 함수를 사용하는 경우에 더 많은 서브루틴 호출로 인한 오버헤드가 있었다. - 작은 함수에 "좋은 이름"을 사용했다면 해당 함수의 코드를 보지 않고도 이해할 수 있다. - 어떤 코드에 "주석"을 남기고 싶다면, 주석 대신 함수를 만들고 함수의 이름으로 "의도"를 표현해보자. 사용할 수 있는 리팩토링 기술 - 99%는 "함수 추출하기(Extract Function)"로 해결할 수 있다. - 함수를 분리하면서 해당 함수로 전달해야 할 매개변수가 많아진다면 다음과 같은 리팩토링을 고려해볼 수 있다. - 임시 변수를 질의 함수로 바꾸기 - 매개 변수 객체 만들기 - 객체 통째로 넘기기 - 조건문 분해하기 - 같은 조건으로 여러개의 switch문이 있다면, "조건문을 다형성으로 바꾸기"를 사용 - 반복문 안에서 여러 작업을 하고 있어서

[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 [내부링크]

지난주 토요일부터 오늘까지 인프런에서 김영한님이 교육해주신 '스프링 DB 1편 - 데이터 접근 핵심 원리' 강의를 듣고 중요한 부분만 내용을 정리해봤다. 사실, 스프링 DB에 대해서 어느정도 이해한다고 생각했었는데 해당 강의를 통해서 자바(스프링) 예외 처리와 트랜잭션에 대해서 보다 기본기를 채울 수 있었다. 1. JDBC 표준 인터페이스 - JDBC는 Java Database Connectivity의 약자로 자바에서 데이터베이스에 접속할 수 있도록 도와주는 API이며, 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공합니다. 현재 회사에서 사용하고 있는 JPA, 전 회사에서 사용하던 MyBatis는 전부 JDBC를 통해서 데이터를 처리한다. JDBCSMS 1997년에 출시될 정도로 오래된 기술이고, 사용하는 방법도 복잡한다. 그래서 최근에는 JDBC를 직접 사용하기 보다는 JDBC를 편리하게 사용하는 다양한 기술이 존재한다. 대표적으로 SQL Mapper(MyBatis,

워커힐(그랜드, 비스타) 호텔 - SK임직원 예약 링크 [내부링크]

8월 11일 ~ 12일 1박 2일로 비스타 워커힐로 호캉스를 다녀왔습니다 ~ 가기전에 어디로 호캉스를 떠날까?~ 많은 고민을 하다가 검색해보니 워커힐 계열의 호텔은 SK 임직원들에게는 보다 저렴하게 예약을 할 수 있기 때문에 임직원 찬스를 이용하기로 하였습니다. 근데, 회사 내 동료분들과 이야기하다보니 생각보다 해당 혜택에 대해서 모르는 분들이 많아서 비스타 워커힐 호캉스에 대한 후기를 올리기전에 SK 임직원들을 위한 예약 프로세스와 예약링크에 대해서 소개하는 글을 먼저 올려볼 예정입니다. 우선, SK 임직원 예약은 아래 링크를 통해서 예약을 진행해주시면 됩니다. https://www.walkerhill.com/reservation/InfraReservationAgreement.wh/ 그랜드 워커힐 서울 그랜드 워커힐 서울, 더글라스하우스, 객실 예약, 레스토랑 예약, 워커힐 리워즈, 워커힐 프레스티지 클럽, 워커힐 멤버십, 미팅, 웨딩, 애스톤하우스, 가족연회, 상견례, 돌잔치,

[Spring] 스프링 부트 시큐리티 - 01.시큐리티 정의와 아키텍처 [내부링크]

업무를 하다가 스프링 부트 시큐리티에 대해서 좀 더 세부적으로 이해하기 위해서 인프런에서 Spring Boot 기반으로 개발하는 Spring Security 강의와 스프링 부트 시큐리티 & JWT 강의를 들었다. 해당 강의를 통해서 스프링 부트 시큐리티의 흐름과 아키텍처에 대해서 이해할 수 있었으며, 이해한 내용을 기반으로 정리해 볼 예정입니다. 우선, 스프링 시큐리티(Spring Security)는 애플리케이션의 보안(인증<Authentication>과 인가<Authorization>을 담당하는 스프링 하위 프레임워크로 인증과 인가에 대한 부분을 Filter 흐름에 따라 처리해줍니다. 인증(Authentication)은 사용자의 신원을 확인하는 프로세스이고, 인가(Authorization)는 신원을 확인한 후 무엇을 할 수 있는지 결정하는 규칙이다. 스프링 시큐리티는 기본적으로 인증을 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 리소스에 대한 접근 권한(ROLE)이 있는지

[Spring] 스프링 부트 시큐리티 - 02.사용자 정의 시큐리티 [내부링크]

지난시간에는 스프링 부트 정의, 아키텍처, 흐름에 대해 알아봤으니, 이제 사용자 정의 스프링 시큐리티에 대해서 코드를 작성하고 정리해봤습니다. 내용은 아래 인프런 강의 기반으로 정리하기 때문에 내용 보고 궁금하신 분들은 아래 강의 참조해주시면 좋을 것 같습니다. < https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/unit/97760?tab=curriculum > 00. 우선, mysql 설정 및 시큐리티 환경 설정(의존성 추가)부터 진행해보겠습니다. 1. mysql 설정 create user 'cos'@'%' identified by 'cos1234'; GRANT ALL PRIVILEGES ON *.* TO 'cos'@'%'; create database security; use security; 2. pom.xml 설정 <de

[Spring] 스프링 부트 시큐리티 - 03.구글/네이버 로그인(OAuth2) [내부링크]

이번에는 구글/네이버와 연동해서 회원가입을 하고 로그인을 연동해 볼 예정이다. 구글 로그인 연동 우선, 구글과 같은 경우에는 구글에 "구글 API 콘솔"을 검색하면 아래와 같은 페이지가 뜨는것을 확인할 수 있다. 위와 같은 경우에는 이미 프로젝트를 연동 후 화면으로 처음 사용하시는 분은 위와 안뜰것입니다. 위 이미지에서 springboot-oauth-google 옆에 아래 화살표를 클릭하면 '새 프로젝트' 클릭해서 생성이 가능합니다. 프로젝트 이름에는 임의의 프로젝트명을 입력한 후 만들기를 클릭합니다. 만든 후에 위에서 이야기한 아래 화살표 옆에 프로젝트명을 클릭해서 임의로 만든 프로젝트명을 클릭합니다. 그 후에는 OAuth 동의 화면으로 들어가서 User Type은 외부로 클릭한 후 만들기를 누릅니다. 그 다음 임의의 애플리케이션 이름을 입력하고 저장을 누릅니다. 그런 다음 사용자 인증 정보 페이지로 들어가서 사용자 인증정보 만들기를 클릭한 후 OAuth 클라이언트 ID를 클릭합니

[쿠팡플레이] 토트넘 vs 세비야 직관 후기!!! [내부링크]

7월 16일 몇개월을 기다리고 기다리던 그날이 왔다!!! 서버가 폭주하고, 취겟팅에 실패하였지만 토트넘 팬클럽 덕분에 티켓을 구매하여 서포터석에서 경기를 관람하였다. 경기는 수원월드컵경기장에서 하기 때문에 소풍터미널에서 수원 광교 박물관까지 시외버스를 타고 이동한 후 도보로 30분 정도 걸은 후 수원월드컵경기장에 도착하였다. 수원 월드컵 경기장으로 걸어가는 도중에 흥민이형과 토트넘 선수들이 탑승하고 있는 선수단 버스도 보며 기대를 하며 경기장을 향해 걸어갔다. 수원월드컵경기장에 도착하니, 우리 쏘니 유니폼을 입은 사람들로 아주 가득찼으며 다들 얼굴에 웃음꽃이 피여보였다. 여유롭게 움직이다 보니, 경기 1시간 30분전인 오후 6시 30분쯤 경기장에 도착하였다. 비가 올까봐 걱정했는데, 아래 사진에서 보는것처럼 날씨가 아주좋다 ~~ 좌석은 3등석 A로 골대 뒤 서포터석으로 경기도 너무 잘보였고, 토트넘 응원가를 부르며 응원하니 훨씬 더 흥이 나고 신났었다. 3등석 A, N4구역 11열

[Spring] Junit5 기본 어노테이션 [내부링크]

지난주 화요일부터 넥스트 스탭에서 진행하는 '이펙티브 코틀린 with TDD, Refactoring, Clean Code 4기' 수업을 참여중인데 해당 수업에서 Junit5를 이용하여 테스트 코드를 필수로 작성해야 하기 때문에 아직 테스트 코드에 익숙하지 않은 나에게 한번 정리해볼 필요가 있어서 Junit5 기본 어노테이션인 @Test, @BeforeAll 부터 @ParameterizedTest, @ValueSource, @CsvSource, @NullAndEmptySource 등까지 정리해 볼 생각이다. 우선, Junit5를 사용하기 위해서는 아래와 같이 build.gradle에서 아래와 같이 spring-boot-starter-test를 주입해주면 된다. dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' } 주입을 하게 되면 아래와 같이 spring-boot-start-test

이직 후 8주차, 회고 [내부링크]

회고(回顧) - 뒤를 되돌아봄. - 지나간 일을 돌이켜 생각함 회고는 '나를 되돌아 보는 수단'이며, '내가 앞으로 나아가기 위한 수단'이다. 이번주는 현재 다니고 있는 회사로 이직한지 8주차가 되는 주이다. 지난번 회고를 작성한 이후 4주가 지났는데, 현재 담당하고 있는 프로젝트 소스를 계속해서 보고 코드를 작성하니 어느정도 도메인과 아키텍처에 대한 흐름에 대해 이해할 수 가 있었다. 사실 입사 첫주와 둘째 주만 하더라도 많은 걱정을 했었는데, 그런 걱정들은 많이 없어졌으며 하루 하루 새로운 것을 배우는데 재미를 느끼며 회사 생활에 적응을 하고 있다. 다행히 아직 입사 초반이라서 많은 업무를 하고 있지 않은 상황이기 때문에 할당된 업무들을 일정에 밀리지 않고 정해진 일정에 잘 진행하고 있다. 회사 업무, 그리고 새로운 회사에 적응을 하면서 추가적으로 회사에서 좋은 교육을 들을 수 있는 기회를 제공해서 넥스트 스텝에서 진행하고 있는 이팩티브 코틀린 with TDD, Refactori

이직 후 13주차, 회고 [내부링크]

회고(回顧) - 뒤를 되돌아봄. - 지나간 일을 돌이켜 생각함 회고는 '나를 되돌아 보는 수단'이며, '내가 앞으로 나아가기 위한 수단'이다. 이번주는 현재 다니고 있는 회사로 이직한지 13주차가 되는 주이다. 원래 지난주에 회고를 작성했어야 했는데... 조금 나태해지고 게을러져서 13주차로 대신해서 올린다. 우선, 이직한 회사 이야기를 하자면 이제 이직한지 3달정도 지나니 전체적으로 회사 돌아가는 부분이나 어떤식으로 동료들과 협업하는지, 회사 시스템은 어떻게 사용하는지 등 이제 거의 적응이 다 끝난 것 같다. 적응이 끝나서 그런지 조금 게을러지고 공부하는 시간이 줄어서 문제이긴 하지만, 반성하고 다음주부터 다시 열심히 달려봐야겠다. 8주차까지는 거의 자바 기반 스프링 프레임워크 애플리케이션 프로젝트를 진행하였지만, 9주차부터는 담당하고 있는 프로젝트 중에서 B2B 기반 프로젝트의 경우에는 자바가 아닌, 코틀린 기반 프로젝트라서 거의 코틀린을 이용해서 업무를 하였다. 사실 코틀린이

[Kotlin] 코틀린 요약 For 스터디 모임 발표 [내부링크]

0. Intro - 코틀린이라는 프로그래밍 언어는 IntelliJ를 만든 JetBrains라는 회사에서 만든 언어 - IntelliJ는 Java 및 Kotlin을 이용한 프로젝트에서 널리 사용되는 통합개발환경(IDE) - 코틀린은 2020년 stack over flow에서 조사한 '개발자들이 가장 사랑하는 언어' 4위에 랭크 - 코틀린은 Java와 100% 호환 가능하기 때문에 JVM 위에서 동작 - 코틀린이 가장 많이 사용되는 곳은 Android 앱 개발과 서버 개발 - 코틀린은 객체지향 프로그래밍(OOP)과 함수형 프로그래밍(FP)를 조화롭게 지원 - 코틀린에서는 Java와 달리, 세미콜론을 붙이지 않아도 됨 -코틀린에서는 출력을 할 때에 System.out.printIn() 대신 printIn()만 작성 -코틀린에서는 함수를 작성할 때 fun이라는 키워드를 사용 1. 코틀린에서 변수와 타입, 연산자를 다루는 방법 1) 모든 변수는 var 또는 val을 붙여줘야 한다. - var

[JPA] 실전! 스프링 데이터 JPA Part5. 스프링 데이터 JPA 분석 / Part6. 나머지 기능들 [내부링크]

1.스프링 데이터 JPA 구현체 분석 - 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 - org.springframework.data.jpa.repository.support.SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository<T, ID> ...{ @Transactional public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } ... } - @Repository 적용 : JPA 예외를 스프링이 추상화한 예외로 변환 - @Transactional 트랜잭션 적용 : 1) JPA의 모든 변경은 트랜잭션 안에서 동작 2) 스프링 데이터 JPA는

[queryDsl] 실전! queryDsl Part1. queryDsl 환경설정 [내부링크]

이전 시간에는 Spring Data JPA를 활용하여 JPA를 편리하게 다루는 방법을 정리해봤다. 하지만, Spring Data JPA의 경우에도 동적 쿼리의 기능을 구현하기가 쉽지 않아서 동적 쿼리에 특화되어 있는 queryDsl에 대해 정리해보는 시간을 갖어볼 예정이다. 현재 업무에서 진행하고 있는 프로젝트의 경우에도 70%는 Spring Data JPA / 30%는 queryDsl을 이용하여 데이터베이스에 접근하고 있다. queryDsl의 경우에도 Spring Data JPA와 같이 인프런 강의를 통해 방법을 익혔으며, 예제 도메인 모델은 기존 Spring Data JPA와 같은 예제를 사용하므로 생략하도록 하겠다. 대신, Spring Data JPA에 비해 queryDsl의 경우에는 환경설정이 복잡해서 따로 환경설정에 대해서 정리해보자. 1. build.gradle에 queryDsl 설정 추가 plugins { id 'org.springframework.boot' versio

[queryDsl] 실전! queryDsl Part2. 기본 문법 [내부링크]

1.기본 Q-Type 활용 - Q클래스 인스턴스를 사용하는 2가지 방법 보통은 2번 방법을 많이 사용. 1) QMember m = new QMember("m"); //별칭 직접 지정 2) QMember qMember = QMember.member; //기본 인스턴스 사용 -기본 인스턴스를 static import와 함께 사용 @SpringBootTest @Transactional public class QuerydslBasicTest { @PersistenceContext EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); } public void startQuerydsl() { Member findMember = queryFactory .select(member) .from(member) .where(member.u

[queryDsl] 실전! queryDsl Part3. 중급 문법 [내부링크]

1. 프로젝션과 결과 반환 - 기본 - 프로젝션 : select 대상 지정 1) 프로젝션 대상이 하나인 경우에는 타입을 명확하게 지정할 수 있음 List<String> result = queryFactory .select(member.username) .from(member) .fetch(); 2) 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 // 튜플로 조회 List<Tuple> result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(member.username); Integer age = tuple.get(member.age); System.out.println("username=" + username); System.out.println("age=" + age); } 2. 프로젝

[queryDsl] 실전! queryDsl Part4. 실무 활용 [내부링크]

1. Querydsl 레파지토리 작성 및 테스트 케이스 작성 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public List<Member> findAll_Querydsl() { return queryFactory .selectFrom(member) .fetch(); } public List<Member> findByUsername_Querydsl(String username) { return queryFactory .selectFrom(member) .where(member.username.eq(username)) .f

[queryDsl] 실전! queryDsl Part5. 스프링 데이터 JPA와 queryDsl 함께 사용하기 [내부링크]

보통, 현업에서는 JpaRepository 인터페이스를 구현해서 인터페이스를 만들어서 Spring Data JPA 기술을 사용한다. 하지만, 동적 쿼리인 경우에는 Spring Data JPA로 구현하기에는 기술적으로 한계가 있어서 queryDsl을 사용한다. 해당 파트에서는 Spring Data JPA와 queryDsl을 혼합해서 사용하는 방법을 정리할 예정이다. 1. 스프링 데이터 JPA와 queryDsl 1) JpaRepository 인터페이스를 구현한 MemberRepository 생성 public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUsername(String username); } 2) 사용자 정의 인터페이스 작성 public interface MemberRepositoryCustom { List<MemberTeamDto> search(MemberSearchCo

[JPA] 실전! 스프링 데이터 JPA Part1. 예제 도메인 모델 [내부링크]

Spring Data JPA는 JPA를 편리하게 사용하기 위해 도와주는 기술이다. 기존 JPA를 사용할 때는 JPQL 문법으로 JPA를 사용했지만, 스프링 데이터 JPA를 사용하면 보다 쉽게 JPQL을 사용할 수 있도록 도와준다. 현재 담당하고 있는 프로젝트의 경우 JPA기반의 프로젝트로 70%는 스프링 데이터 JPA를 활용하고 나머지 30%는 queryDsl을 사용한다. 스프링 데이터 JPA를 배우기 위해 인프런에서 강의를 듣고 복습할겸 내용을 정리해보는 시간을 갖어봤다. 우선, 전체적인 교육을 위해 Member, Team 엔티티와 엔티티가 이상없는지 테스트 케이스를 작성하였다. Member Entity 정의 @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedV

[JPA] 실전! 스프링 데이터 JPA Part2. 공통 인터페이스 기능 [내부링크]

순수 JPA를 사용해서 Member, Team 각각의 Repository를 생성하면 코드도 복잡해지고 신경써야 할 것이 많다. 그리고, 코드 또한 중복 투성이다. 예를 들어, 각 엔티티의 데이터를 넣는 경우에는 em.persist(team or member) 이런식으로 다 각각 메서드를 생성해서 해야한다. 이럴때 스프링 데이터 JPA가 제공하는 공통 인터페이스를 적용해보자. 공통 인터페이스를 적용하는 방법은 아주 간단하다. JpaRepository를 상속받아서 MemberRepository / TeamRepository 인터페이스를 생성하면 된다. JpaRepository를 상속받아서 인터페이스를 작성해주면 스프링 데이터 JPA가 MemberRepository/TeamRepository 구현체를 생성해준다. public interface MemberRepository extends JpaRepository<Member, Long> {} public interface TeamRepos

[JPA] 실전! 스프링 데이터 JPA Part3. 쿼리 메소드 기능 [내부링크]

이제 본격적으로 스프링 데이터 JPA를 사용하는 방법에 대해서 알아보자. 우선, 쿼리 메소드 기능은 아래와 같이 3가지 기능을 제공한다. 1) 메소드 이름으로 쿼리 생성 => MemberRepository / TeamRepository 인터페이스에 직접 정의 2) @Query 어노테이션을 사용 => MemberRepository / TeamRepository 인터페이스에 직접 정의 3) 메소드 이름으로 JPA NamedQuery 호출 => 사용하는데 코드가 복잡해져서 거의 사용 안함 => 생략 1. 메소드 이름으로 쿼리 생성 - 이름과 나이를 기준으로 회원을 조회하려면? 1) 순수 JPA를 이용하는 경우 public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and

[JPA] 실전! 스프링 데이터 JPA Part4. 확장 기능 [내부링크]

1. 사용자 정의 리포지토리 구현 - 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동생성 - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 - 동적 쿼리를 위한 queryDsl을 사용하기 위해서 인터페이스의 메서드를 직접 구현하고 싶다면 어떻게 해야할까? 1) 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List<Member> findMemberCustom(); } 2) 사용자 정의 인터페이스 구현 클래스 @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List<Member> findMemberCustom() { return em.createQuery

[Modern Java in Action] Chapter4: 스트림 소개 [내부링크]

Chapter 4. 스트림 소개 - 컬렉션이 없다면 무슨 일이 벌어질까? 거의 모든 자바 애플리케이션은 컬렉션을 만들고 처리하는 과정을 포함한다. 컬렉션으로 데이터를 그룹화하고 처리할 수 있다. 컬렉션은 대부분의 프로그래밍 작업에 사용된다. 컬렉션으로 데이터를 그룹화하고 처리할 수 있다. 컬렉션은 대부분의 프로그래밍 작업에 사용된다. 대부분의 자바 애플리케이션에서는 컬렉션을 많이 사용하지만 완벽한 컬렉션 관련 연산을 지원하려면 한참 멀었었다. 하지만, 이제 자바 8에서 스트림의 등장으로 프로그래머의 귀중한 시간을 절약하고, 편리한 삶을 누리게 해줬다. 4.1 스트림이란 무엇인가? - 스트림은 자바 8 API에 새로 추가된 기능으로 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. - 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 자바 7에서 저칼로리의 요리명을 반환하고, 칼로리를 기준으로 요리를 정렬하는 코드 List<Dish> lowCal

[Modern Java in Action] Chapter5: 스트림 활용 [내부링크]

Chapter 5. 스트림 활용 - 스트림 API가 지원하는 연산을 이용해서 필터링, 슬라이싱, 매핑, 검색, 매칭, 리듀싱 등 다양한 데이터 처리 질의를 표현할 수 있다. 다음으로 숫자 스트림, 파일과 배열 등 다양한 소스로 스트림을 만드는 방법과 무한 스트림 등 스트림의 특수한 경우도 살펴본다. 5.1 필터링 5.1.1 Predicate를 이용한 필터링 - 스트림 인터페이스는 filter 메서드를 지원한다. - filter 메서드는 Predicate<T>(boolean을 반환하는 함수)를 인수로 받아서 Predicate와 일치하는 모든 요소를 포함하는 스트림을 반환한다. public class Practice { public static void main(String[] args) { List<Dish> menu = Arrays.asList( new Dish("season fruit", true, 120, Dish.Type.OTHER), new Dish("prawns", fals

[Modern Java in Action] Chapter6: 스트림으로 데이터 수집 [내부링크]

Chapter 6. 스트림으로 데이터 수집 - 5장에서는 스트림을 이용해서 데이터베이스 같은 연산을 수행할 수 있음을 배웠다. 4장과 5장에서는 스트림에서 최종 연산 collect를 사용하는 방법을 배웠지만, toList로 스트림 요소를 항상 List로만 변환했다. 이 장에서는 reduce가 그랬던 것처럼 collect 역시 다양한 요소 누적 방식을 인수로 받아서 스트림을 최종 결과로 도출하는 리듀싱 연산을 수행할 수 있음을 설명한다. 다양한 요소 누적 방식은 Collector 인터페이스에 정의되어 있다. 6.1 컬렉터란 무엇인가? - 이전 예제에서 collect 메서드로 Collector 인터페이스 구현을 전달했다. Collector 인터페이스 구현은 스트림의 요소를 어떤식으로 도출할지 지정한다. 6.1.1 고급 리듀싱 기능을 수행하는 컬렉터 - collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 강점이다. 구체적으로 설명해서

[Modern Java in Action] Chapter11: null 대신 Optional 클래스 [내부링크]

Chapter 11. null 대신 Optional 클래스 - NullPointerException은 초급자, 중급자, 남녀노소를 불문하고 모든 자바 개발자를 괴롭히는 예외긴 하지만 null이라는 표현을 사용하면서 치러야 할 당연한 대가이다. 하지만, 처음 null을 등장 시킨 영국 컴퓨터과학자 토니 호어는 구현하기 쉬웠기 때문에 null을 도입했다고 회상하였다. 그리고 여러 해가 지난 후 호어는 당시 null 및 예외를 만든 결정을 가리켜 '십억 달러짜리 실수'라고 표현했다. 50년이라는 null 참조의 역사에 비추어볼 때 null로 인한 실질적인 피해비용은 이보다 클 수 있다. 먼저 null 때문에 어떤 문제가 발생할 수 있는지 간단한 예제로 알아보자. 11.1 값이 없는 상황을 어떻게 처리할까? - 다음처럼 자동차와 자동차 보험을 갖고 있는 사람 객체를 중첩 구조로 구현했다고 하자. public class Person { private Car car; public Car get

[Spring] 통합 테스트(Integration Test)에 대한 정리 [내부링크]

지난 게시글은 단위 테스트에 대해서 정리해봤으면, 이번에는 통합 테스트에 대해서 정리해볼 예정이다. 현재 다니고 있는 회사의 경우에는 POC 접점이 많아서 단위 테스트 보다는 통합 테스트 위주로 진행되고 있기 때문에 보다 깊게 정리해볼 생각이다. 우선, 애플리케이션 코드와 테스트 코드로 나눠서 진행해봤다. 1. 애플리케이션 코드 1) UserEntity.java @Entity @Table(name="user") @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class UserEntity { @Id @GeneratedValue private Long userId; private String userName; @Builder public UserEntity(String userName) { this.userName = userName; } } 2) UserRepository.jav

[Spring] API 예외 처리 인프런 강의 복습 [내부링크]

회사에서 일을 하다보니, API 예외를 처리하는데 있어서 좀 헷갈리는 부분이 있어서 인프런 - 스프링 강의 중 API 예외 처리에 대한 강의를 복습하며 정리하는 시간을 갖도록 하였다. 우선, RunTimeException을 상속받는 UserException 클래스를 생성해보자. 생성한 후 기존 RunTimeException 클래스의 메서드를 오버라이딩 하자. 아래는 UserExcetpion이란 이름을 사용하였지만, 보통 하나의 공통 Exception을 생성하여 해당 Exception을 통해 예외를 처리하는 식으로 진행 된다. 1. UserException.java public class UserException extends RuntimeException { public UserException() { super(); } public UserException(String message) { super(message); } public UserException(String messag

[Modern Java in Action] Chapter2: 동작 파라미터화 코드 전달하기 [내부링크]

회사에서는 매주 수요일 마다 팀 내 백엔드 개발자끼리 책 하나를 선정해서 스터디를 진행하고 있다. 최근에 입사해서 스터디 중간에 합류하는 바람에 앞 부분은 개별적으로 공부하며, 공부한 내용을 블로그에 정리하 며 공부해 볼 생각이다. 이번 스터디의 선정된 책은 Modern Java In Action으로 자바 8 이후에 변화된 내용들 위주로 어떻게 하면 더 실용적으로 쓸 수 있는지 나와있는 내용이다. 현재 람다, 스트림 등 부족함이 많았는데 해당 책을 통해 람다, 스트림 등 부족한 내용들을 채울 수 있었으면 좋겠다. Chapert1은 전체적인 내용 요약본으로 일단은 Chapter1은 건너 뛰고 Chapter2부터 진행해볼 예정이다. 그리고 책의 모든 Chapter를 공부하기보다는 필요한 부분만 진행할 생각이다. Chapter 2. 동작 파라미터화 코드 전달 - 우리가 어떤 상황에서 일을 하든 소비자 요구사항은 항상 바뀐다. 변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제

[Modern Java in Action] Chapter3: 람다 표현식 [내부링크]

Chapter 3. 람다 표현식 - 동작 파라미터화를 이용해서 변화하는 요구사항에 효과적으로 대응하는 코드를 구현할 수 있음을 2장에서 확인했다. 익명 클래스로 다양한 동작을 구현할 수 있지만 만족할 만큼 코드가 깔끔하지는 않다. 깔끔하지 않는 코드는 동작 파라미터를 실전에 적용하는 것을 막는 요소다. 3장에서는 더 깔끔한 코드로 동작을 구현하고 전달하는 자바 8의 새로운 기능인 람다 표현식을 설명한다. 또한 람다 표현식과 함께 위력을 발휘하는 새로운 기능인 메서드 참조를 설명한다. 3.1 람다란 무엇인가? - 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. - 람다의 특징 1) 익명 : 보통의 메서드와 달리 이름이 없으므로 익명이라 표현. 구현해야 할 코드가 줄어듬 2) 함수 : 메서드처럼 특정 클래스에 종속 X. 메서드처럼 파라미터/바디/반환형식을 포함 3) 전달 : 람다 표현식을 메서드 인수로 전달하고 변수로 저장 4) 간결성 : 익명 클래스

[Spring] Spring Batch 알아보기! [내부링크]

이직한 후에 현업을 하게되면서 전날 모은 데이터(사용자 데이터)를 배치 프로그램을 돌려서 AWS(S3)에 올리는 작업을 진행해야 했는데, Spring Batch를 사용해본 경험이 없기 때문에 다른 개발자님들의 블로그를 보며 정리해보았다. 1. 배치 어플리케이션이란? - 배치는 일괄처리란 뜻을 가지고 있습니다. 제가 현업에서 담당한 것처럼 매일 전날의 데이터를 집계 해야하는 상황에서 이 집계 과정을 어디서 수행하면 될까요? 현재 저는 웹 어플리케이션 밖에 모르기 때문에 Tomcat + Spring MVC를 떠올리게 됩니다. 하지만 이렇게 큰 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 자원을 다 써버려서 고객들의 요청을 처리하지 못하게 됩니다. 또한 이 집계 기능은 하루에 1번 수행되기 때문에 이를 위해 API를 구성하는것은 너무 낭비입니다. 바로 이런 단발성으로 대용량의 데이터를 처리하는 어플리케이션 배치 어플리케이션이라고 합니다. 위의 고민들을 다시 생각해보면 배치

[Java] Jackson 라이브러리 이해하기 [내부링크]

기존 회사에서도 Json 형식으로 데이터를 주고 받아서 어느정도 Jackson 라이브러리에 대해 사용해본적 있지만, 현재 회사의 경우에는 외부 서버와 통신이 많고 외부 서버와 통신을 할 때 모든 데이터를 Json 형태로 데이터를 전송하고 받는 경우가 많으며, 데이터의 형식도 좀 복잡한 부분이 많아서 한번 정리해보는 시간을 갖는 것이 좋을 것 같아서 한번 시간을 갖고 정리해봤다. 우선, Jackson 라이브러리에 대해서 설명하기 전에 직렬화 / 역직렬화에 대해 간단히 정리하고 시작하자. 직렬화 : 자바 객체를 Json 형태로 변환(Convert "Java Object" to "Json") 역직렬화 : Json 형태를 자바 객체로 변환(Convert "Json" to "Java Object") 1. Jackson 라이브러리란? - 스프링 프레임워크로 어플리케이션을 개발하다보면, text/html 형식이 아닌 데이터 전달 목적으로 사용하고 싶을때가 있습니다. 물론, 쌩 문자열인 plain

이직 후 4주차, 회고 [내부링크]

회고(回顧) - 뒤를 되돌아봄. - 지나간 일을 돌이켜 생각함 회고는 '나를 되돌아 보는 수단'이며, '내가 앞으로 나아가기 위한 수단'이다. 2022년 3월 21일, 원하고 원하던 이직을 드디어 성공을 하고 이직한 회사에 첫 출근한 날이다. 사실, 갑작스럽게 찾아온 기회였지만 친한 친구와 같이 스터디 모임을 하고 있는 스터디 구성원들 덕분에 갑작스럽게 찾아온 기회를 잡을 수 있었다. 현재 이직한 회사는 판교에 있는 회사 중 하나이며, 나의 실력으로는 입사하기 쉽지 않은 회사였지만 모든 일이 잘 풀려서 입사 할 수 있었던 것 같다. 입사하고 4주차인 지금, 현재 다니고 있는 회사는 정말로 좋다. 일단 개발자들의 꿈인 판교로 출퇴근을 한다는 점이 가장 크며, 함께 일하는 동료들이 똑똑하며 배울점이 많다는 것을 느낄 수 있었다. 또한, 기존 다니던 회사보다 연봉이나 복지는 비교가 안 될 정도로 많이 좋아져서 자신감 또한 많이 올라갔다. 입사하고 4주가 지나고 내가 느끼는 생각은 정말 우

[Java] Reflection 개념 및 사용방법 [내부링크]

기존 프로젝트에 테스트 코드를 분석하다가 모르는 부분이 있어서 검색해보니 해당 내용이 자바의 Reflection이라는 내용이였다. 전에 인프런 강의를 듣다가 Reflection 이라는 용어가 나왔지만, 그 당시에는 크게 중요하지 않아서 그냥 넘겼는데 테스트 코드를 보니 자바 Reflection을 많이 사용하고 있어서 공부할 겸 한번 내용을 정리해봤다. 우선, 자바의 Reflection 개념에 대해서 알아보자. Reflection(리플렉션)은 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메서드를 접근 제어자와 상관없이 사용할 수 있도록 지원하는 API이다. 여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. new 키워드를 통해 만드는 객체와는 다른 것임을 유

[Spring] 단위 테스트(Unit Test)에 대한 정리 [내부링크]

현재 담당하고 있는 프로젝트의 경우, API를 추가하거나 수정하는 경우 무조건 테스트 케이스를 작성해서 테스트 케이스를 통과해야 실제 업무에서 사용할 수 있다. 지금까지 테스트를 작성해서 사용하는 경우에는 인프런 강의를 들을 때만 사용해봐서 보다 깊게 이해하기 위해 단위 테스트 / 통합 테스트에 대해서 정리해보는 시간을 갖어볼 예정이다. 이번 게시글에는 단위 테스트에 대해서 내용을 정리해보도록 하겠다. 1. 단위 테스트 vs 통합 테스트 1) 단위 테스트 : 단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈을 애플리케이션에서 작동하는 하나의 기능 또는 메서드라고 이해하면 된다. 예를 들어 웹 애플리케이션에서 컨텐츠를 목록을 조회하는 메서드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다. 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤

[제대로 파는 Git & Github - by 알코] 6. Git 보다 잘 활용하기 [내부링크]

1. Help와 문서 활용하기 - 기본적인 명령어들과 설명 : git help - Git의 모든 명령어들 : git help -a - 해당 명령어의 설명과 옵션 보기 : git (명령어) -h - git help (명령어) 2. Git의 각종 설정 1) global 설정과 local 설정 - git config --global user.name "이름" => global 설정 - git config user.name "이름" => local 설정 2) 설정값 확인 - 현재 모든 설정값 보기 : git config (--global) --list - 에디터에서 보기 : git config (--global) -e - 기본 에디터 수정하기 : git config --global core.editor "code --wait" 또는 code 자리에 원하는 편집 프로그램의 .exe파일 경로 연결 wait : 에디터에서 수정하는 동안 CLI를 정지 git commit 등의 편집도 지정된 에디터

[제대로 파는 Git & Github - by 알코] 7. 프로답게 커밋 관리하기 [내부링크]

1. 어떻게 커밋하는게 좋을까요? 1) 작업을 커밋할 때 권장사항 1-1) 하나의 커밋에는 한 단위의 작업을 넣도록 합니다. - 한 작업을 여러 버전에 걸쳐 커밋하지 않습니다. - 여러 작업을 한 버전에 커밋하지 않습니다. 1-2) 커밋 메시지는 어떤 작업이 이뤄졌는지 알아볼 수 있도록 작성합니다. 2) 커밋 메시지 컨벤션 type: subject (커밋의 작업 내용 간략히 설명) body (길게 설명할 필요가 있을 시 작성으로 필수값이 아님) ... ... ... footer (Breaking Point가 있을 때 작성으로 필수값이 아님) ================================================= feat: 압축파일 미리보기 기능 추가 사용자의 편의를 위해 압축을 풀기 전에 다음과 같이 압축파일 미리보기를 할 수 있도록 함 - 마우스 오른쪽 클릭 - 윈도우 탐색기 또는 맥 파인더의 미리보기 창 Closes #125 2. 보다 세심하게 스테이징하고 커밋

[Spring Cloud] Open Feign 적용하기 [내부링크]

3월21일부로 이직한 회사는 기존 회사와 달리, 대규모 서비스를 운영하기 때문에 외부와 Rest Api 방식으로 통신을 많이 하였다. 사실, 기존 회사에서는 외부와의 통신이 많지 않아서 URLConnection 및 HttpURLConnection 클래스를 이용하여 외부와 통신을 하였지만, 현재 회사의 경우에는 "Open Feign" 이라는 Http Client Binder를 이용하여 외부와 통신을 하였다. 기존에 하던 방식과 달리 interface를 작성하고 annotation을 선언하기만 하면 되기 때문에 매우 편리함을 느꼇다. Open Feign에 대한 설명은 우아안 형제들 기술 블로그에 있는 내용을 참고하면 작성하였습니다. 우선, Feign은 Netflix에서 개발된 Http client binder입니다. Feign을 사용하면 웹 서비스 클라이언트를 보다 쉽게 작성할 수 있으며, 위에 말한것처럼 interface를 작성하고 annotation만 선언하기만 하면 되서 쉽게 작성

[macOs] 맥 사용하는 포트 조회 및 포트 죽이기 [내부링크]

톰캣을 사용하다보면, "이미 포트번호가 사용중입니다" 라는 메시지를 많이 볼 수 있다. 이런 경우, 아래 첨부파일과 같이 해당 포트번호를 사용하는 커맨드와 PID 확인이 가능하며, kill 명령어를 통해서 포트를 죽일 수 있다.

[Spring] Spring REST Docs 알아보기! [내부링크]

이번에 이직한 현재 회사의 경우에는 REST API를 문서화 하는 방법 중 하나인 Spring REST Docs를 사용하고 있어서 이번에 사용 방법에 대해서 한번 정리해봤다. 우선, Spring REST Docs란 무엇일까?? - Spring REST Docs는 REST API를 문서화 하기 위해 제공하는 기능으로 REST API를 명세화 하는 방법은 여러가지 방법이 있지만 Swagger와 REST Docs의 차이점만 비교하고 REST Docs에 대해서 알아보자. 1. Swagger - Controller를 기준으로 기본적인 REST API 문서를 작성해준다. - 제공되는 Annotation으로 문서를 보완할 수 있다. - Production Code에 Annotation으로 기술하기 때문에 코드의 가독성이 떨어진다 - Spring Security를 적용하여 권한에 따라 노출할때 설정을 하기 까다롭다. 2. REST DOCS - Controller에 대한 Test Code를 기반으로

[제대로 파는 Git & Github - by 알코] 1.Git 시작하기 [내부링크]

1. Git을 배워야 하는 이유 1) Git은 프로젝트의 시간과 차원을 자유롭게 넘나들 수 있도록 해줍니다. - 시간 : 프로젝트의 버전을 과거로 되돌리거나 특정 내역을 취소할 수 있습니다 - 차원 : 프로젝트의 여러 모드를 쉽게 전환하고 관리할 수 있습니다. 2) Git은 여러 사람들이 프로젝트에서 협업할 수 있도록 도와줍니다. 2. 강의를 위한 설치와 세팅 - https://www.yalco.kr/@git-github/1-3/ 1) homebrew 설치 - https://brew.sh/ 2) Git 설치 - 해당 명렁어로 Git 설치(brew install git) - 설치 후 터미널을 재 실행하여 git --version 으로 확인 3) SourceTree 설치 - Git을 GUI로 다룰 수 있도록 해주는 툴 4) VS code 설치 - 가장 인기있는 코드 에디터 중 하나 - 설치 후 실행하여 컨트롤 + '~' 을 눌러서 터미널창을 활성화 한다. 5) iTerms2 설치 및 세

[제대로 파는 Git & Github - by 알코] 2. 시간 여행하기 [내부링크]

1. 변화를 타임캡슐에 담아 묻기 1) 프로젝트의 변경사항들을 타임캡슐(버전)에 담기 - 변경사항 확인, git status < 추적하지 않는 파일 : Git의 관리에 들어간 적 없는 파일 > - 파일 하나 담기, git add tigers.yaml < 모든 파일 담기는 git add . > - 파일 하나 담은 후 git status 2) 타임캡슐 묻기 - git commit - git commit 을 하는 경우, Vim 모드로 이동하며 commit message를 작성하라고 뜸 - 위 과정이 번거롭다면, 커밋과 동시에 메시지를 작성할 수 있다. < git commit -m "FIRST COMMIT" > - git log 명령어를 통하여 커밋한 내역을 확인할 수 있다. - 커밋한 내역을 종료하기 위해서 :q 눌러서 내역에서 벗어난다. 3) 변경사항들을 만들고 타임캡슐에 묻기 - 우선, 파일별로 내용을 수정하거나 파일을 삭제하고 추가한다. - 그 후 git status 명령어를 이용하

[제대로 파는 Git & Github - by 알코] 3. 차원 넘나들기 [내부링크]

1. 여러 branch 만들어보기 - 브랜치 생성 : git branch 생성할 브랜치명 - 브랜치 목록 확인 : git branch - 브랜치 이동 : git switch 브랜치명 - 브랜치 생성과 함께 이동 : git switch -c 생성할 브랜치명 - 브랜치 삭제 : git branch -d 삭제할 브랜치명 - 브랜치 이름 변경 : git branch -m 기존 브랜치명 변경할 브랜치명 2. 서로 다른 브랜치를 합치는 두 방식 - merge : 두 브랜치를 한 커밋에 이어 붙입니다. - rebase : 브랜치를 다른 브랜치에 이어 3. branch 합치기 실습 1) merge - main 브랜치로 이동하여 add-coach 브랜치에서 커밋한 내용 merge < git merge add-coach > - merge도 하나의 커밋으로 reset 명령어를 이용하여 원복이 가능하다. 2) rebase - rebase의 경우에는 merge와 달리 main이 아닌, new-teams 브

[제대로 파는 Git & Github - by 알코] 4. GitHub 사용하기 [내부링크]

1. GitHub는 뭐고 왜 쓰나요? - GitHub는 원격 저장소 역할을 하며, 여러 개발자들이 작성한 코드들을 공유하기 위해 사용한다. 2. GitHub 시작하기 1) GitHub는 Git으로 관리되는 프로젝트의 원격 저장소 2) 가입하고 토큰 만들기 - GitHub에서 가입한 후 Personal access token 만들기 - 우측 상단의 프로필 - seeting - Developer Settings - Personal access toke - Generate new toek - repo 및 원하는 기능에 체크, 기간 설정한 후 Generate token한후 생성된 토큰번호를 안전한곳에 저장 < 생성한 토큰 내역 > 3) 생성한 토큰 번호를 사용하는 컴퓨터에 저장하기 - mac > 키체인 접근 앱 실행하여 시스템 키체인 카테고리에서 시스템에서 github.com의 인터넷 암호 항목을 선택한 후 사용자명(계정)과 토큰(생성한 토큰 번호)를 붙여넣은 후 저장한다. 4) 소스트리에

[제대로 파는 Git & Github - by 알코] 5. Git 보다 깊이 알기 [내부링크]

1. Git의 3가지 공간 1) Working directory - Untracked : Add된 적 없는 파일, ignore된 파일 - tracked : Add된 적 있고 변경내역이 있는 파일 - git add 명령어로 Staging area로 이동 2) Staging area - 예시 : 작업을 위해 선택된 파일들 - git commit 명령어로 Repository로 이동 3) Repository - .git directory라고도 불림 - 커밋된 상태 4) 파일의 삭제와 이동 - 파일을 삭제한 후 git status로 확인을 하면 working directory에 있음 - 그래서, 번거롭게 git add . 처리를 해줘야 한다 - 하지만, git rm 파일명 명령어를 통해 삭제한 후 git status로 확인하면 Staging area에 있음 - 파일명을 변경한 후 git status로 확인을 하면 working directory에 있음 - 그래서, 번거롭게 git add .

[제대로 파는 Git & Github - by 알코] 0. 인트로 [내부링크]

이직을 성공하여 다다음주 월요일인 3월21일 부터 자사 서비스를 운영하는 회사로 출근을 하게되었다. 아무래도 현재 회사보다 규모도 크고, 여러 개발자들과 함께 협업 할 일이 많아 지기 때문에 Git/Github에 대해서 깊게 공부할 필요가 있다고 생각하여 평소에 즐겨보던 개발 유튜버인 얄코님의 Git/Github 인프런 강의를 구매하여 강의를 들어볼 생각이다. 현재 회사의 경우에는 별도로 branch를 두지 않고 그냥 main 하나로 여러 개발자들이 pull, push 등을 진행하였지만 규모가 커짐에 따라 별도로 branch를 두고 각자가 작업한 내용을 merge 하는 등 작업이 많아 질 것 같다. 아마 해당 강의를 통해서 어느정도 알고 가더라도 아마 실제로 일하면서 충돌이나 예상하지 못한 상황들이 많이 생기겠지만, 그래도 어느정도 한번 정리하고 가면 좋을 것 같다. 목차는 다음 아래와 같다. 1. Git 시작하기 2. 시간 여행하기 3. 차원 넘나들기 4. GitHub 사용하기 5