블로그

Rojojun

[워밍업 클럽 스터디 2기::백엔드] 후기

스터디 회고4주간 스터디를 쉼없이 달려왔다.여러가지 일이 있었고, 재미있는 지점도 지루한 지점도 존재하였다.하지만 중요한 건 포기하지 않고 계속 한다 라는 가장 원론적이고 근본적인 자세다! 이미 지나간 말인데 중요한 건 꺾이지 않는 마음이라는 것 같다! 감상적인 이야기는 여기서 끝내고, 회고답게 이 스터디에서 얻어간거 추천하는 것 등등 모든 것을 빠짐 없이 기록하여 3기를 참여하고자 하는 사람들에게 도움을 주고자한다. 스터디 추천도무조건 추천한다! 다만, 끝까지 완주할 의지가 있을 경우에만 추천한다.완주라는게 어떤 사람들은 4주의 진도를 막힘없이 따라가는 것이고, 어떤 사람들은 진도가 중요한게 아니라 4주안에 어떻게든 끝내는 것이 될 수 있다.인프런에서는 4주의 진도를 막힘없이 따라가면 완주러너, 그리고 거기서 더 잘하면 우수러너라는게 있다.즉, 동기부여가 될게 두 가지가 있다는 것이다. 완주러너 & 우수러너하지만 가장 큰 동기부여는 무언가를 뛰어넘어 성장한 자기자신이지 않을까?약간 나는 애니덕후 기질이 있어서 나의 히어로 아카데미아를 좋아하는데 한계를 뛰어넘어라는 이야기를 이야기를 좋아한다.각자 외부에서 주는 동기부여가 아닌 내부에서 주는 동기부여로 한계를 뛰어넘는데 의의가 있는 것이다. 커리큘럼의 난이도또 하나 중요한거 나는 클린코드 & 테스트코드 스터디를 진행하게 되었는데, 시원하게 오픈하면 나는 2년차 백엔드 개발자다 (이번주에 진짜 2년이 되요~~!! 🥳)혹자가 봤을 땐 아닐 수도 있는데, 아직 나는 응애 아가 개발자 중 하나라는 것이다.그런 내가 보았을 때 난이도는 적절한편이다. 중립적인 단어인거 같은데, 어려운 부분은 어려웠다.쉬운부분은 쉬웠고, 그니깐 난도 조절을 정말 잘했다는 것이다... 이것은 강사님의 강의의 퀄리티가 좋다! 라는 것과 일맥상통하는데, 나는 강의에 금액 투자를 신중하게 한다.강사님들에게는 죄송한 이야기지만 어찌되었든간에 나는 소비자니깐! 소비하려는 제품이 얼마나 좋은지 봐야하는데, 확실한 제품아니면 잘 안 구매한다ㅋㅋ...그렇지만! 이번 강의는 진짜 좋다! 더 나은 백엔드 개발자를 고민하였다면 구매를 추천한다! 정리하자면Readable Code 강의는 클린코드를 읽어만 본 사람들, 혹은 적용을 하는데 많이 못하는 사람들에게 추천하는 난이도다.근데, 기본적으로 자바에 대해서 혹은 OOP에 대해서 잘 모른다하면 권장하지 않는다.https://www.inflearn.com/course/practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C/dashboardTest Code 강의는 아이러니한 부분이긴 한데, 클린코드를 읽어 보거나 회사 실무내에서 테스트코드가 없이 테스트 하는 것에 대해 한계를 느낀 개발자들에게 추천하는 난이도이다.근데, 기본적으로 다양한 테스트를 경험해보지 않는다면... 테스트코드가 얼마나 좋은지 모를지도 모른다.그냥 내 발목을 붙잡는 쓸모없는 거라고 생각할 수도?https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard 이건 좋아요첫번째, 강사님의 빠른 피드백과 코드 리뷰 너무 좋았다.코드 리뷰도 신청하면 대부분 다 해줘서, 진짜 너무 좋았다.이게 참 강사님 입장에서도 시간적으로 비용일텐데 이렇게 우리 수강생들에게 엄청난 투자를 해줬다는 것에 대해 압도적으로 감사를 가진다!두번째, 전반적인 운영이 매끄러웠다.'인프런에서 진행해서...' 라는 이야기를 안하고, 여타 다른 운영과 비교해 보았을 때 꽤나 괜찮은 운영이라고 느껴졌다.특히나, 디스코드 내에서 직원분들이 이것저것 질문에 대해서 답변을 빠르게 해주거나 아니면 수강생들끼리 채널을 열 수 있게 하는 그런 것들을 하나의 시스템 제도로 만들어서 참 잘 활용하는 것 같다.세번째, 동료들이 자극을 준다.물론 나는 회사동료들하고 같이해서 서로가 서로에게 자극을 주었지만, 이 스터디는 디스코드로 진행되어 자유롭게 이야기를 할 수 있다.여기서 자유롭게 이야기를 할 때 많은 사람들이 스터디 관련해서 이야기 하고 어떤 분은 공부시간 체크, 오늘 한 것 체크 등등 엄청난 분들이 있다 (이름도 외웠다 ㅋㅋㅋㅋ)사실 그 분들을 보면서 엄청 자극이 되서 나도 열심히 공부하게 되는 경우가 있었다. 이건 나빠요좋은 말만 쓰는 것은 싫다 ㅋㅋ 억까라해도 스터디의 단점으로서 장점처럼 세가지를 정할 것이다.첫번째, 야생이다.자신이 진짜 누군가 케어를 해줘야만 공부를 하는 타입이라면, 중도 포기할 가능성이 높다.특히나, 이 스터디는 본인의 의지가 중요한 것이기 때문에, 중간에 '아 밀렸어 안해 포기!' 이렇게 되는 이상 돌이킬 수 없다...두번째, 짧은 네트워킹 타임일단 네트워킹 타임이 50분이라는게 좀 아쉽다... 사람에 따라 다를 수 있는데, 나는 좀 말이 많고 다른 사람들하고 이야기 하는 것을 좋아해서 다른 사람들 그리고 다른 회사에서 어떻게 일하는지 궁금하고 그게 나의 인사이트가 되고 싶은데... 뭔가 엔진이 과열될만 하면 끝나버린다!충분히 이해할 수 있는게 한정된 시간 속에서 진행하는 거고 다 나 같은 사람일거라 생각하지 않기 때문에 이해하는 부분이다.세번째, 낯가리는 우리들...문제는 우리다! 다들 낯을 너무 많이 가린다... 스터디를 함으로서 제2차 파생된 그룹이 나오거나 하는 선순환이 많이 나와야하는데 공개적으로는 두개? 밖에 못본거 같다! 물론, 나도 이건 할 말이 없는데!다음에 스터디를 하게 된다면, 나도 낯을 안가리고 조금 주도하는 역할로 롤을 변경해봐야하지 않나 싶다! 혼자 공부하는게 아니라 같이 공부해야만 내 공부와 내 가설이 맞는지 검증이 되기 때문이다. 진짜 마지막참 우여곡절이 많은 스터디다.뭐 잘하지도 않고, 글재주도 안좋고 마지막만 사진 좀 넣었는데 ㅋㅋㅋ 평소에는 사진도 안넣는다.비효율적인 것을 극도로 자제하는 스타일이라 이런 것을 싫어한다.그런 내게 우수러너라는 상을 준 것에 대해 진짜 너무 감사하고 함께 스터디를 한 내 동료들 진짜 항상 같이 스터디 하는 동료들을 보며 느낀게, 우리가 지금은 이 자리에 있지만 앞으로 더 나아가자는 이야기를 하는데 진짜 진심이다.믿고 의지할 수 있는 동료고 더 높은 자리에서 서로를 볼 수 있을거라고 확신한다. 마지막은 우수러너로 받은 잔, 근데 하이볼을 곁들인 ㅇ_< 

백엔드인프런인프런워밍업클럽스터디2기java자바스프링

유원준

[인프런 워밍업 클럽(백엔드, 0기)] - 개별 정리 : 자바 어노테이션

스프링으로 프로젝트를 하면서 자바 어노테이션을 항상 사용해 왔지만 아직 잘 모르는 부분이 많은 것 같아서 1일 차에 대한 과제 제출 기간은 지났지만, 추가적으로 인프런 블로그를 통해 다시 한 번 정리해 보고자 한다. (1) https://twojun-space.tistory.com/178본인 블로그에 내용을 별도로 정리했지만 한 번 더 리마인드해 보고자 한다.   1. 자바 어노테이션(Java Annotation)1-1. 정의(1) 어노테이션은 사전적 정의로는 "주석"이라는 의미를 가지고 있지만 자바에서의 어노테이션은 소스 코드에 추가할 수 있는 일종의 메타 데이터라고 볼 수 있다.(2) 애플리케이션 레벨에서 처리되어야 하는 대상이 아닌, 컴파일, 런타임 시점에 코드를 어떻게 처리해야 할지 알려주기 위한 정보로 볼 수 있겠다.  1-2. 장점(1) 코드 가독성, 컴파일 시점에서의 오류 체크코드 레벨에서 동일하게 작성되기 때문에 코드의 가독성이 좋고, 일부 어노테이션의 경우 컴파일 시점에 문법 에러(아래에서 설명할 @Override, @FunctionalInterface)를 잡아주기도 한다. (2) 중복 코드 제거중복되는 어노테이션의 경우 공통화시킬 수 있고 재사용이 가능하기 때문에 코드의 중복을 줄이고 효율적인 코드 작성이 가능하다. (3) 커스텀 어노테이션 (사용자 정의 어노테이션) 사용 가능직접 용도에 맞게 커스텀 어노테이션을 작성할 수 있다. 프로젝트를 진행함에 따라 각각 필요한 제약사항들을 별도로 정리해서 커스텀 어노테이션 구성이 가능하다.  1-3. 단점(1) 런타임 시 발생할 수 있는 오버헤드만약 런타임 시점에 자바의 리플렉션(Reflection) 등을 사용해서 처리되는 어노테이션이라면 이 부분을 처리하기 위한 별도의 오버헤드가 발생할 수 있다 (성능 상 문제)    2. 어노테이션의 종류살펴볼 어노테이션의 종류로 총 2가지가 있다.(1) 표준 어노테이션(빌트 인 어노테이션)(2) 메타 어노테이션    3. 표준 어노테이션(1) 표준 어노테이션의 경우 자바에서 기본적으로 제공하고 있는 어노테이션이다. 대표적으로 아래와 같이 3가지가 있다. 3-1. @Override(1) 현재 메서드가 부모 타입 클래스 또는 인터페이스의 메서드를 오버라이딩했음을 컴파일러에게 명시하는 역할을 수행한다. 만약 형식에 맞지 않게 오버라이딩되었다면, 컴파일러가 이를 인지하고 오류를 발생시킨다.  3-2. @Deprecated(1) 현재 메서드를 사용하지 않도록 유도한다. 만약 해당 어노테이션이 붙은 메서드를 사용하면 컴파일러가 오류를 발생시킨다.  3-3. @FunctionalInterface(1) 해당 인터페이스가 함수형 인터페이스임을 명시한다. 함수형 인터페이스의 경우 추상 메서드가 반드시 1개 존재해야 한다. 추상 메서드가 존재하지 않거나 2개 이상이라면 컴파일러가 오류를 발생시킨다.    4. 메타 어노테이션(Meta Annotation)(1) 메타 어노테이션이란 다른 어노테이션에서 사용될 수 있는 어노테이션을 의미하며 아래에서 작성할 커스텀 어노테이션(사용자 정의 어노테이션)을 생성할 때 주로 사용되는 어노테이션이다.   4-1. @Target(1) 어노테이션을 적용할 위치를 알려주는 어노테이션이다. (2) 예를 들어 @Target(ElementType.TYPE)의 경우 해당 어노테이션을 다른 어노테이션의 대상으로 사용할 수 있다는 의미이다. (3) 메타 어노테이션을 선언해 줄 때 사용되는 일반적인 방법 중 하나다.@Target({ ElementType.PACKAGE, // 패키지 선언 ElementType.TYPE, // 타입 선언 ElementType.CONSTRUCTOR, // 생성자 선언 ElementType.FIELD, // 멤버 변수 선언 ElementType.METHOD, // 메소드 선언 ElementType.ANNOTATION_TYPE, // 어노테이션 타입 선언 ElementType.LOCAL_VARIABLE, // 지역 변수 선언 ElementType.PARAMETER, // 매개 변수 선언 ElementType.TYPE_PARAMETER, // 매개 변수 타입 선언 ElementType.TYPE_USE // 타입 사용 })  4-2. @Retention(1) @Retention의 경우 어노테이션이 적용되고 유지되는 범위를 설정하기 위해 사용되는 메타 어노테이션이다.@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 JVM에 의해서 참조가 가능하다. @Retention(RetentionPolicy.CLASS) // 컴파일러가 클래스를 참조할 때까지 유효하다. @Retention(RetentionPolicy.SOURCE) // 어노테이션 정보는 컴파일 이후 없어진다.  4-3. @Inherited(1) 해당 어노테이션이 적용된 경우 자식 클래스가 해당 어노테이션을 상속받을 수 있게 된다.(2) 따라서 부모 클래스에 선언된 @Inherited 어노테이션은 하위 클래스에서 자동으로 상속받는다.  4-4. @Repeatable(1) 반복 가능한 어노테이션을 정의할 때 사용될 수 있는 어노테이션이다.    5. 커스텀 어노테이션(Custom Annotation, 사용자 정의 어노테이션) 5-1. 정의, 사용 방법public @interface SimpleAnnotation { }(1) 자바에서는 위와 같이 @interface 키워드를 통해 커스텀 어노테이션을 정의할 수 있다.   5-2. 실제로 커스텀 어노테이션 적용해 보기@Retention(RetentionPolicy.RUNTIME) @Inherited @Target(ElementType.TYPE) @RestController @RequestMapping("/new") public @interface CustomMyAnnotation { String name() default "MemberController"; String value(); } @CustomMyAnnotation(name = "MemberController", value = "MemberController") @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @GetMapping("/list") public List<MemberListResponseDto> getAllMemberList() { List<Member> allMemberList = memberService.findAllMembersList(); return allMemberList.stream() .map(member -> new MemberListResponseDto(member)) .collect(Collectors.toList()); } }  5-3. 자바의 리플렉션(Reflection)(1) 현재 어노테이션을 사용해서 코드의 가독성이 좋아짐은 물론 어노테이션 자체가 되게 많은 일을 대신 해주고 있는 것을 확인해 볼 수 있다. 이 부분은 자바의 리플렉션 기술들이 해결해 주고 있는데 추후에 리플렉션에 관한 내용을 블로그에 다시 한 번 정리해 볼 예정이다.  마지막으로 부족하지만 글을 읽어주신 분들께 감사드립니다!!  

백엔드백엔드인프런워밍업자바어노테이션스프링

Groot

<워밍업 클럽 2기 - 백엔드 클린 코드, 테스트 코드> 4주차 발자국

강의 수강수강한 강의: Practical Testing: 실용적인 테스트 가이드학습 내용 요약Mocking에 관해 배웠다. 여러 stub과 mocking 기법에 관해서 배우며 정리하는 시간을 가졌다.노트 중 일부말고도 private method에 관한 테스트나 Classicist VS. Mockist 부분에서는 어떤 것이 어떤 상황에 어울리는지 등을 배웠다. 회고이번에 Mock과 Stub애 관해 개념을 제대로 잡으면서 잘못하고 있었던 부분들을 점검할 수 있었다.이번 주를 마지막으로 강의를 모두 완강하게 되었는데 테스트 부분은 수강하며 여러모로 반상하게 되는 시간이기도 했다. 왜 테스트를 하는지, 어떤 관점에서 바라보는지가 매우 중요했고 직접 짜는 것을 보며 배우니 추상적인 부분도 코드로 풀어내는 것을 볼 수 있어서 실전 감각을 익히기 좋았다.미션해결 과정Mock, Stub에 관한 어노테이션들을 정리하고 수도코드로 된 테스트 케이스를 직접 어떻게 짤 것인지 제시해보는 미션을 받았다.모든 테스트 케이스 모두 사용자 하나와 게시글이 필요해서 이러한 공통된 부분은 @BeforeAll에 배치했다. 나머지는 늘하던대로 Given, When, Then 형식으로 작성했다. 실제 코드 작성은 없어서 금방 끝났었다.회고Spy를 사용해본적이 아직 없는데 Spy를 사용해서 테스트 코드를 더 짜봐야겠다는 생각이 들었다. 실제 사용 사례를 좀 더 찾아봐야겠다!그리고 뭔가 마지막 미션이 너무 무난해서 제대로 한건지 궁금하다. 다른 사람의 수행한 결과물도 보며 복습해봐야겠다.

백엔드클린코드자바워밍업클럽2기워밍업2기

Rojojun

[워밍업 클럽 스터디 2기::백엔드] 3주차 발자국

1주일간의 학습 회고테스트코드의 강의를 완강하였다.이번 주 공부한 분량은 생각보다 많지는 않았다.중점적으로 관심있던 부분은 TestFixture와 RestDocs였다.TestFixture 강의 내에서 나온 TextFixture는 많은 내용이 없었지만, 실제로 프로젝트에서 이 강의를 보기전에 적용해 본 적이 있다.가장 도움이 되었던 내용은 토스의 기술 블로그였다. (하단 참조)https://toss.tech/article/how-to-manage-test-dependency-in-gradle예전에 프로젝트에서 적용하면서 느낀 장점과 단점에 대해 간단하게 기술해보면 다음과 같다.사실 적용법은 너무 많은 블로그에 나와 있기 때문에, 개인적인 장/단점을 공유하는게 옳다고 생각한다.장점Fixture관리가 편하다테스트 코드에서 Fixture를 파편화 시켜서 사용하지 않아도 된다.Gradle에서 지원한다단점Fixture도 관리 대상이 된다실제로 Entity나 DTO가 변경될 때 Fixture를 변경하지 않아서 빌드가 안되거나 하는 경우가 있었는데, 너무 번거롭다.모든 팀원들이 인지하지 않으면 꽤나 힘들다... (개인적인 생각이다)깊은 연관관계가 되어 있는 경우에는 결국 여러개의 Fixture와 Fixture 시나리오를 구성해야하기 때문에 꽤나 번거롭다.위와 같은 문제점을 해결하기 위해서, 고민을 덜기 위해 FixtureMonkey 라는 것도 고민을 해보았는데, 막상 생각보다 그렇게 와우 모먼트를 이끌만하지 않았기에 Fixture를 계속 사용하였다. RestDocs강사님이 이야기한것들 중에 정말 많은게 공감이 되었다.강사님은 RestDocs, Swagger 비교를 하셨지만 거기서 더 나아가서 PostMan과 같은 상용 API 문서화 툴까지 비교를 하자면, 회사 내 우리팀은 BFF 로서 백엔드 프론트가 나뉘어져 있다. 그렇기에 API 문서화가 중요한데 API 문서화 툴의 단점은 업데이트 주기가 사람한테 맞추어져있다는 점이다.그래서, Swagger를 도입하느냐 마느냐에 대한 이야기가 있었다. 개인적으로... Swagger를 반대하는 이유는 강의내용과 같다. Swagger가 프로덕션 코드에 침투하는게 너무 싫다!! 그러나... RestDocs를 사용하는 이야기는 하지 않았다... 왤까?이유는 다음과 같다. 아스키독스에 대한 학습이 싫다 -> 빠르게 도입을 해야할 때 발목을 잡을 수 있다TestCode에 대한 지식이 모든 팀원이 100%가 아니다 -> 사실 위 내용이 컸다....좋은 방안과 툴이여도 결국 회사의 상황과 역량에 따라 어쩔 수 없지만, 개인적인 프로젝트에서는 도입을 해볼 계획이다.해봐야 ㅋㅋ 이게 효율적인지 아닌지 알거 같다! 이번 주 학습에서 잘한 점사내에 개선점들이 있어서 개선에 도움을 주고자 간단한 프로젝트를 자체 개발하고 있었다...프로젝트를 하면서, 느리지만 개인적으로 한달정도를 예상하고 있어서 TDD를 통해서 그리고 읽기좋은 코드로 만들고 있다.향후 유지보수와 문서화를 위해서 내가 공부한 내용을 적용할 수 있게 했다. 아쉬웠던 점금요일에!! 깜짝 세션이 있었다... 참여를 못했다!!!같이 공부하는 팀원들과 함께 질문할것이 있었는데 ㅠㅠㅠ 하지를 못했다... 내 질문은 TDD의 영역이다...TDD의 영역이란 테스트 커버리지 퍼센트가 아닌 실용적인 이야기다...개인적으로 실용주의적인 개발자라 생각하여 나는 테스트코드가 100% 커버리지 혹은 90% 이상 커버리지를 좋다고 생각하지는 않는다.그래서 TDD의 영역에 대해 물어보려 했는데ㅠㅠ.... 회사 팀원들과의 협업TDD의 영역에 대해 같이 공부하고 있는 회사 동료들에게 물어봤다! 동료 중 한 명이 강사님에게 물어보라 했는데 ㅠㅠ 까먹었다... 또한 그 동료가! 물어본 것들 중 하나가... 인터페이스의 테스트 영역에 대해서 세명이서 토론하다가 이것도 물어보자! 해서 끝났다...좋은 동료와 좋은 스터디를 하고 이런 개념들을 발전해 나가서 너무 좋다!

백엔드테스트코드백엔드자바스프링

Groot

<워밍업 클럽 2기 - 백엔드 클린 코드, 테스트 코드> 3주차 발자국

강의 수강수강한 강의s: Readable Code: 읽기 좋은 코드를 작성하는 사고법, Practical Testing: 실용적인 테스트 가이드학습 내용 요약이번주는 클린코드를 완료하고 테스트에 관한 강의로 넘어갔다.Test 필요성, TDD, BDD 등을 배우고 실제 클린코드에서 리팩터링한 코드를 짜보는 시간을 가졌다.회고개인적인 사정(코테, 면접, 스터디, ...)으로 미션 7 이후로 진도 조절에 실패해서 강의자료를 보면서 이해 안 되는 것 위주로 빠르게 수강하고 있다. 뭔가 정신 없이 밤이나 새벽에 하다보니 되게 힘들었다. 오늘 몰아서 진도를 정상화시키고 월요일 과제는 좀 더 여유롭게 할 수 있도록 해야겠다...미션해결 과정스터디카페를 잡고 테스트를 짜보았다. 대충 개념이나 어떻게 짜면 되는지는 이해가 됐는데 막상 시작하려니깐 되게 막막했다. 일단 특수한 모델 객체부터 검증해나가며 테스트를 점진적으로 추가해가다 보니 풀리기 시작했다.하다가 내가 원한 모든 테스트케이스를 완성하지는 못했다. 외부에 의존하는 사이드 이펙트를 다루는게 좀 어려웠다. Scanner나 이상한 데이터를 주입했을 때도 테스트하고 싶었는데 실패했다.회고Scanner 같은 부분을 테스트하려고 하는데 stdin까지 원하는대로 컨트롤하려니깐 이상했다. 외부에 의존하는 부분을 만들려다 그 코드가 엄청 길어지니깐 굳이 Class를 직접 갖다 않고 Mock으로 원하는 방향으로 만들어 주는게 자연스러워보이기 시작했다.한번 Application, PassMachine 코드를 Mock으로 외부 디펜던시를 만들고 검증해보려했는데 한참 삽질하다가 실패했다. 마침 아직 못 본 섹션 7의 Mock이다. 얼른 섹션 7을 수강하고 내가 생각하는 방향이 맞는 점검해보고 다시 시도해볼 예정이다!

백엔드클린코드워밍업클럽2기자바워밍업2기

V_브이_v

[인프런 워밍업 클럽 스터디 2기]: JPA가 그래서 뭔데;;

인프런 스터디 2주차 발자국입니다.이번 주는 강의를 들으면서 진도를 수행하던 중에 PROJECT_SKILL 테이블이 h2 DB에서 조회되지않는 문제를 발견하고 왜 안되는지 찾아보았고 그과정에서 JPA: 영속성 콘텍스트 라는 녀석 때문에 테이블이 생성되지않았다는 점을 배웠습니다.그래서 이번주는 JPA와 영속성 콘텍스트에 대해서 혼자 자습을 조금 해보았는데,,,너무 혼자 시간을 허비한거 같습니다궁금한 내용들이 꼬리를 물고 계속 생겨서 🫤 차라리 쉽게 설명해주는 강의를 찾아서 배웠으면금방 지나갈 거 같은 개념에 시간을 많이 쓴거 같아 아쉬웠습니다.아무튼 아래는 이번주에 혼자 자습하면서 배워본 내용들을 정리한 것입니다.전부 다 외운건 아니고 어느정도? 얕게는 이해를 마쳤다고 생각합니다.혹시나 틀린 내용이 있다면 지적 부탁드립니다. 감사합니다.0. ORM이란 무엇인가ORM(Object-Relational Mapping)은 객체 지향 프로그래밍에서 데이터베이스와 상호작용하기 위한 기술로, 객체와 관계형 데이터베이스 간의 데이터를 매핑하여 변환하는 역할을 합니다. ORM은 데이터베이스의 테이블과 객체 지향 언어의 클래스를 연결해주어, 개발자가 SQL 쿼리 없이도 객체를 사용하여 데이터베이스 작업을 수행할 수 있게 합니다.ORM의 주요 개념객체 지향적인 접근: ORM을 사용하면 데이터베이스의 테이블을 객체로 다룰 수 있다.이는 데이터베이스의 행(row)을 객체의 인스턴스로 변환하고, 컬럼을 객체의 속성으로 변환하는 것을 의미한다.자동화된 매핑: ORM은 SQL 쿼리 생성과 데이터베이스와의 상호작용을 자동으로 처리하므로, 개발자가 비즈니스 로직에 집중할 수 있게 도와준다.대표적인 ORM 도구: Hibernate, JPA(Java Persistence API), MyBatis 등이 있다.   1. JPA란 무엇인가JPA(Java Persistence API)는 ORM 기술의 표준 인터페이스로, 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 명세를 제공한다. JPA는 직접적으로 ORM 기능을 제공하는 것이 아니라, ORM 기술을 위한 규칙과 표준을 정의하여, 다양한 구현체(Hibernate, EclipseLink 등)가 기능을 수행함.JPA의 정의 및 역할ORM 표준 인터페이스: JPA는 ORM 기술의 표준을 정의하여, 개발자가 특정 구현체에 의존하지 않고 일관된 방식으로 데이터를 처리할 수 있게 한다.구현체의 예시: JPA의 구현체로는 Hibernate, EclipseLink, OpenJPA 등이 있으며, 이들 구현체는 JPA의 인터페이스를 구현하여 실제 데이터베이스 작업을 수행한다.개발자들이 JPA를 사용하는 이유생산성 향상: JPA는 데이터베이스 작업을 객체 지향적으로 처리할 수 있게 함으로써, SQL 쿼리 작성의 부담을 줄이고 코드의 가독성을 높인다.유지보수 용이성: 엔티티 매핑을 통해 데이터베이스의 구조 변경에 따른 코드 변경을 최소화할 수 있다.데이터베이스 독립성: 특정 데이터베이스에 종속되지 않으며, 다양한 데이터베이스로 쉽게 이식할 수 있는 애플리케이션을 구축할 수 있다. JPA를 사용할 때 주의해야 할 사항성능 문제: 잘못된 엔티티 설계나 관계 매핑으로 인해 성능 문제가 발생할 수 있으므로, 캐시와 페치 전략을 적절히 사용해야 합니다.복잡한 설정: 영속성 컨텍스트, 트랜잭션 관리, Fetch 전략 등 복잡한 설정과 개념을 이해하지 않으면 예상치 못한 동작이 발생할 수 있습니다.자동 쿼리 생성 기능의 오해: Spring Data JPA에서 제공하는 기능과 JPA 자체의 기능을 혼동하지 않도록 주의해야 합니다. 2. JPA의 특징객체 지향적인 데이터베이스 접근: JPA는 데이터를 객체로 매핑하여 직접 조작할 수 있게 합니다. 이를 통해 SQL의 복잡한 문법 없이도 데이터를 처리할 수 있습니다.자동화된 데이터베이스 스키마 관리: JPA의 스키마 설정 옵션(create, update, validate 등)을 통해 데이터베이스 스키마를 자동으로 생성하거나 검증할 수 있습니다.1차 캐시: JPA 표준에서 지원하는 기능으로, 영속성 컨텍스트 내에서 관리되며 트랜잭션 범위 내에서 데이터를 캐시한다. 동일한 트랜잭션 내에서는 데이터베이스에 재접근하지 않고 메모리에 저장된 엔티티를 사용한다.2차 캐시: JPA 표준에는 포함되지 않고, JPA의 구현체(예: Hibernate)에서 지원하는 기능이다. 2차 캐시는 애플리케이션 범위에서 동작하며, 여러 영속성 컨텍스트 간에 데이터를 공유하여 성능을 최적화한다. 이를 사용하려면 Ehcache, Hazelcast, Infinispan 등과 같은 캐시 프로바이더를 통합해야 한다고 하는데 아직 무슨 말인지 잘 모르겠다...영속성 컨텍스트: 엔티티 매니저가 관리하는 영속성 컨텍스트는 엔티티의 상태를 추적하고, 동일한 트랜잭션 내에서 동일한 데이터를 캐싱하여 성능을 향상시킬 수 있다.Fetch 전략: 데이터 로딩 방식으로 즉시 로딩(EAGER)과 지연 로딩(LAZY)이 있으며, 성능과 자원 사용을 최적화할 수 있다.Cascading(영속성 전이): 부모 엔티티의 상태 변경이 자식 엔티티에도 자동으로 전이되도록 설정할 수 있다.영속성 콘텍스트에 대해서도 자습했는데 아직 내용이 정리되지않아서 다음번 블로그 글에서 작성해보도록 하겠습니다.  

스프링자바JPA

Groot

<워밍업 클럽 2기 - 백엔드 클린 코드, 테스트 코드> 2주차 발자국

강의 수강수강한 강의: Readable Code: 읽기 좋은 코드를 작성하는 사고법학습 내용 요약이번주는 OOP, SOLID 원칙에 이어서 실제로 적용해보는 연습을 많이했다.특히, 실제 코드를 기반으로 코드를 어떻게 다음고 리팩터링할 수 있는지 현실적인 접근 방안을 많이 배웠다.회고깔끔하게 코드를 만들고 리팩터링을 어떻게 하라는지는 이해됐다. 하지만 이걸 어떻게 실제로 적용할지는 또 다른 문제였다...그래서 그런지 Day 7 미션이 되게 많은 도움이 되었다. 미션 처음에는 방대하진 않지만 여러 클래스로 나눠진 코드를 바로 크게 개선하려고 하니 부담스럽고 어렵게 느껴졌다. 하지만 차근차근 메서드를 추출하고 적용해가다보니 점점 어떻게 구조를 개선할지 보이게 되어서 되게 재밌었다.미션해결 과정위에서 말했듯이, 코드 실제로 리팩터링하는 미션을 받았다. 회고배운 내용을 토대로 차근차근히 작은 부분부터 인지적으로 읽기 쉬운 구조로 고치고 더 뻗어나가서 책임, 역할에 관한 분배를 나누고 메시지를 정제?하며 확장하기 좋은 코드를 만들어갔다. 되게 새로운 경험이었고 앞으로도 실제 코드를 개선할 때 어떻게 할지 감을 잡을 수 있는 좋은 미션이었다. 

백엔드클린코드워밍업2기자바

Rojojun

[워밍업 클럽 스터디 2기::백엔드] 2주차 발자국

1주일간의 학습 회고테스트코드의 강의를 듣기 시작하였다.80% 정도 듣게 되었고, 항상 회사에서 테스트 코드에 대한 필요성을 느끼며 팀원 몇 명과 함께 테스트 코드를 작성하고 있었는데, 팀원이 추천한 강의로 항상 이 강의의 개념에 대해서 적용하도록 도와주었다...그 때 보라할 때 볼걸 그랬다...ㅠㅠㅠ 코드 리뷰를 받다강의를 일찍 끝내서 숙제를 강사님에게 빨리 제출하였다.내가 잘해서 검사를 맡은게 아니라 코드가 형편 없어도 200명 앞에서 내 코드는 이래요~~!! 하는 자신감을 보여줘야한다고 생각해서, 코드 리뷰를 신청했다. 일단, 결론은 더 잘하기 위한 동기부여가 되었다.  동기부여가 왜 되었을까?일단 나의 지적사항은 두 가지 그리고 질문도 두 가지였다. 첫번째, 내가 잘해서 지적이 두 가지라고 생각하지 않는다.두번째, 나는 못하니깐 많은 사람들 앞에서 까이고 싶다. 그래야만 더 잘하려고 노력하기 때문이다.세번째, 질문... 내가 고민하는 것들은 많은 사람들이 고민하는 거라는 것을 느꼈다. 첫번째 지적 사항public enum StudyCafePassType { ... public static StudyCafePassType sendTypeBy(String userInput) { try { int inputCode = Integer.parseInt(userInput); return Arrays.stream(values()) .filter(type -> type.inputCode == inputCode) .findFirst() .orElseThrow(() -> new AppException("잘못된 입력입니다.")); } catch (NumberFormatException e) { throw new AppException("입력값은 숫자가 되어야합니다."); } } }이러한 코드를 enum에서 작성하였다.일단, 작성하면서도 코드 스멜을 느꼈다.'비즈니스 로직에 대해서 Enum이 너무 깊게 연관하는게 아닐까?'위의 고민을 가지면서, 만들었는데 아니나 다를까 강사님은 역할과 책임을 이야기 하면서 이 부분의 코드를 지적하였다. 참고로 ㅋㅋ 같이 워밍업 클럽 참여하는 동료도 회사내 클린코드 적용하면서 이런식으로 적용했는데... 그 날 당일에 나는 저 코드는 문제 있는거 같다고 계속해서 지적했다! 두번째 지적 사항은... 그냥 실수다... static 남발인데... 이게 가끔씩 ㅋㅋ 귀찮아서 static 쓰는 경우가 있는데... 이 부분은 진짜 화끈거렸다... 이번 주 학습에서 잘한 점이번 주 학습에서 내가 스스로 잘했다고 생각한 부분은 숙제를 하면서 나 스스로 생각을 많이 했다는 것이다.물론, 코드에서 좋은 것들을 가져와서 쓸 수 있지만, 내가 하는거고 나의 공부기 때문에 강사님의 코드 스타일 포맷을 그대로 따라가지 않으려고 노력했었다. 아쉬웠던 점: 리뷰를 하자성격이라 그런가... 숙제나 그런거를 낼 때는 그냥 리뷰를 안한다...그러다가 이번처럼 참 ㅋㅋ 어이없는 실수를 해서 지적할 받을 때가 있다... 이것을 그냥 '아, 이건 실수~' 하고 무시하는게 아니라 이게 실력이다 ㅠㅠ...  회사 팀원들과의 협업팀 동료 중 한 분이 이번에 인프런 워밍업 클럽을 들으면서 클린코드를 적용하였다.정말, 너무 좋았고 같이 듣는 동료와 함께 세명이서 그 코드에 대해서 토론하고 좋은 방향 등에 대해서 이야기를 하였다.배움이, 단지 배움이 아니라 실제적으로 적용되서 살아있는 공부가 되었다.앞으로도 이러한 스터디를 하고 이러한 문화를 팀동료들과 계속해서 이뤄가고 싶다.그러려면 더 잘해야겠지 ㅠㅠ...

백엔드백엔드클린코드자바스프링

Groot

<워밍업 클럽 2기 - 백엔드 클린 코드, 테스트 코드> 1주차 발자국

강의 수강수강한 강의: Readable Code: 읽기 좋은 코드를 작성하는 사고법학습 내용 요약이번주는 가볍게 추상, 인지 부하를 줄여주는 코드 작성법, SOLID 위주로 공부했다.회고이번주는 익숙한 내용이 많아서 쭉쭉 진도를 나갈 수 있었다. 뒤에 가면 어렵지 않을까?역시 매주 미션이 주어지니 목표가 있어서 훨씬 의욕적으로 수강하게 되는 것 같다.계속 인프런 사이트에 접속하다보니 예전에 할인하길래 사두고 방치한 강의도 다시 보게 된다. 문득 이렇게 여유로운 날에 모두 공부해봐야 겠다는 생각이 든다. ㅎㅎ인프런의 노트 기능을 처음 써봤는데 내용을 상기하기 좋았다. 이미지도 첨부되어서 그냥 아무 맥락 없이 내 개인 노트에 남기기 보다 노트 기능으로 남겨두니 더 맥락있게 볼 수 있어서 좋았다. 앞으로도 활용해볼 것 같다.미션해결 과정이번주는 간단한 미션이라 큰 무리없이 진행할 수 있었다.회고간단한 코드도 직접 고쳐보고 내용을 적용해볼 수 있어서 좋았다. 원칙들을 내 언어로 풀이하는 것도 재밌었고 이해도를 높여주는 것 같다.앞으로도 아직 나에게 생소한 원칙/개념이 있다면 나만에 언어로 풀이해보면 좋을 것 같다. 

백엔드클린코드워밍업클럽2기자바

최강현

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

Day 7. 스프링 컨테이너의 의미와 사용 방법 이 날 강의를 통해서 드디어 베일에 쌓인 의존성을 공부하는 기회가 되었다.의존성이란다음 코드를 보면 UserController의 생성자는 JdbcTemplate이라는 클래스를 필요로 하고 있다. @RestController public class UserController { private final UserService userService; public UserController(JdbcTemplate jdbcTemplate) { this.userService = new UserService(jdbcTemplate); } }이것을 어려운 말로 '의존한다'라고 한다. 스프링 빈이란스프링부트 서버를 시작할 때 자동으로 해주는 것 중 하나가 거대한 컨테이너(실제 컨테이너를 떠올리면 된다)를 만드는 것이다.이 컨테이너 안에는 클래스가 들어가게 되는데 이렇게 들어간 클래스를 스프링 빈이라고 부른다.클래스가 들어갈 때는 이 빈을 식별 할 수 있는 이름 및 타입과 다양한 정보가 들어가고 인스턴스화도 이루어진다. Day8. Spring Data JPA를 사용한 데이터베이스 조작 8일차 강의를 통해 SQL을 통해서 접근했던 DB를 자바 객체를 DB와 매핑 시켜서 사용하는 JPA를 학습하였다. JPA란객체와 관계형 데이터베이스의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙JPA는 API이기 때문에 말 그대로 규칙이고 (자바의 인터페이스와 같다) 이 규칙을 누군가는 실제로 구현을 해야한다그 구현체가 바로 Hibernate이다. Day9. 트랜잭션과 영속성 컨텍스트 9일차 강의는 서비스 계층의 남은 중요한 역할인 트랜잭션에 대해 배웠다.트랜잭션이란 쪼갤 수 없는 업무의 최소단위이다.실제로 예를 들면 인터넷 결제를 진행할 때 1. 주문 기록을 저장하고 2. 포인트를 적립해주고 3. 구매 기록을 저장해준다이 3가지의 과정을 쪼갤 수 없는 하나의 최소단위로 묶고 하나가 실패하면 다른 모든 과정도 실패해버리게 만드는게 트랜잭션이다. Start transaction -> 성공하면 COMMIT -> 실패하면 ROLLBACK 또한 영속성 컨텍스트에 관해서도 학습했는데 조금 어려워서 꼭 기억해야하는것스프링에서는 트랜잭션을 사용하면 영속성 컨택스트가 생기고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다. 영속성 컨텍스트의 특별한 능력변경 감지 : 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save를 해주지 않더라도 알아서 변경을 감지하여 저장할 수 있게 해준다.쓰기 지연 : 영속성 컨텍스트에 의해 트랜잭션이 Commit 되는 시점에 SQL을 모아서 한 번만 날리게 된다.1차 캐싱 : ID를 기준으로 Entity를 기억하는 기능이다. 조금 더 복잡한 기능을 API로 구성하기 10일차는 앞서 배운 것들로 JPA를 이용해서 책 생성, 대출, 반납 API를 개발해보았다. 과제 과제 4일차https://devnter.tistory.com/entry/%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%9B%8C%EB%B0%8D%EC%97%85-%ED%81%B4%EB%9F%BD-1%EA%B8%B0BE-4%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9CqueryForObject() 에 대한 학습이 필요. 과제 5일차https://devnter.tistory.com/entry/%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%9B%8C%EB%B0%8D%EC%97%85-%ED%81%B4%EB%9F%BD-1%EA%B8%B0BE-5%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C주어진 코드를 클린코드로 리팩토링하는 과제를 수행하였다.클래스를 나누기에는 너무 작은 기능이라 생각해서 읽기 좋은 코드로만 수정한다는 생각으로 수정했는데나중에 금요일에 코치님이 따로 열어주신 특강에서 테스트를 하기 위해 역할 별로 클래스를 쪼개고 테스트를 하는 강의를 진행 해 주셔서 새로운 내용에 대해 학습하는 기회가 되었다리팩토링 전에는 테스트를 작성하자! (Junit5, assertj)given / when / then 패턴전략 패턴 (= NumberGenerator의 인터페이스화 + 구현체 갈아끼우기)일급컬렉션MVC 패턴출처 https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90# 아쉬운점좀 더 추가적인 학습(모르는것에 대한 학습)을 하려고 했는데 나태해져서 진행하지 못했다. 다음 마지막 주차는 좀 더 내가 모르는 내용에 대해 민감하게 반응해서 학습 하거나 학습 하지 못한다면 따로 블로그나 노션에 기록해서 추후 공부할 수 있도록 하겠다. 

백엔드인프런워밍업클럽자바스프링javaspring

최강현

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

강의 수강,과제 수행하면서 생겼던 궁금증을 해결하는 과정을 위주로 블로그 글을 작성하려고 합니다. 강의 수강 1일차 - OT 인프런 워밍업 클럽 스터디 및 일정 소개 코치님과 구글 밋을 통해 온라인 OT를 진행하였습니다.간단한 스터디 과정 및 일정에 대해 소개 해줬고, 코치님이 이거까지 알아야하나? 라는 주제로 의견을 공유해주셨습니다. 2일차 - 서버 개발을 위한 환경 설정 및 네트워크 기초 (1강 ~ 5강)2일차에는 서버, 네트워크, HTTP, API를 배웠다.API가 무엇인지 잘 몰랐는데 Input을 주면 OutPut이 나오는 함수와 비슷하다는걸 알게 되었다. API가 무엇인지 와닿지 않았는데 감을 잡을 수 있었다3일차 - 첫 HTTP API 개발 (6강 ~ 10강)GET API와 POST API를 개발해봤다.GET 요청은 쿼리를 통해서 요청을 주고 POST 요청은 body를 통해 요청을 주는데@RequestParam을 통해 주어지는 쿼리를 함수 파라미터에 넣는다.파라미터 대신에 DTO 객체를 넣어서 쿼리를 받을 수 있다public class CalculatorAddRequest{ private final int number1; private final int number2; public CalculatorAddRequest(int number1, int number2) { this.number1 = number1; this.number2 = number2; } public int getNumber1() { return number1; } public int getNumber2() { return number2; } }  post 요청은 body로 들어오는 JSON을 DTO로 바꿔주기 위해 @RequestBody를 사용해야하는데@RequestBody를 사용하면 DTO 객체에 생성자를 만들지 않아도 괜찮은데 이 이유가 궁금했다public class CalculatorMultiplyRequest { private int number1; private int number2; public int getNUmber1(){ return number1 } public int getNumber2(){ return number2; } }다음과 같은 이유를 찾을 수 있었다.Spring의 동작 방식: @RequestBody 어노테이션이 적용된 메서드 파라미터에는 HTTP 요청의 본문을 기반으로 객체가 생성됩니다. Spring은 이를 위해 클래스의 기본 생성자를 호출하여 빈 객체를 생성하고, 요청의 본문에서 추출한 데이터를 객체에 설정합니다.4일차 - 기본적인 데이터베이스 사용법 (11강 ~ 13강) MySQL의 사용법을 배웠다DDL(데이터 정의어) - CREATE, ALTER, DROPDML(데이터 조작어) - INSERT, UPDATE, SELECT, DELETE이 2개를 사용해서 데이터를 DB에 생성, 조회, 갱신, 삭제하고5일차 - 데이터베이스를 사용해 만드는 API (14강 ~ 16강)이 강의를 통해 사람이 직접 DB에 접속해서 DB를 조작하는게 아닌 Spring 서버가 MySQL DB에 접근해서 DB를 조작하게 API를 만들었다. 6일차 - 클린코드의 개념과 첫 리팩토링(17강~ 18강) 이 강의를 통해 저번 강의를 통해 만든 컨트롤러 클래스를 3개의 클래스로 쪼개 보았다.Controller 클래스 - API의 진입 지점으로써 HTTP Body를 객체로 변환Service 클래스 - 분기처리 로직Repository 클래스 - SQL을 사용해 실제 DB와의 통신을 담당 컨트롤러 클래스 작성 시 JdbcTemplate 객체를 생성하는데 new 키워드를 사용하지 않고 생성했다이게 어떻게 가능한지 궁금해서 찾아보니스프링에서는 보통 dependency injection을 사용하여 객체를 주입합니다. 이 코드에서도 JdbcTemplate jdbcTemplate는 생성자를 통해 주입됩니다.생성자 public UserController(JdbcTemplate jdbcTemplate)에서 JdbcTemplate 객체가 주입됩니다. Spring이 UserController를 생성할 때, 필요한 JdbcTemplate 객체를 찾아서 자동으로 주입해줍니다. 이것이 Spring의 IoC (Inversion of Control) 컨셉입니다.따라서 new 키워드를 사용하여 직접 객체를 생성할 필요가 없고, Spring이 해당 객체를 관리하고 주입해줍니다.미션1일차어노테이션을 미리 정의 해두면 @RequestParam 같은 한 단어만 작성해주면 스프링이 알아서 GET 요청의 쿼리를 메서드의 파라미터로 바꿔준다.어노테이션은 이런 마법 같은 일을 해준다.  2일차문제1Controller에서 getter 메서드가 있는 객체를 반환하면 반환 값이 JSON으로 반환 한다! CalculatorResponse.java public class CalculatorResponse { private int add; private int minus; private int multiply; public CalculatorResponse(int num1, int num2) { this.add = num1 + num2; this.minus = num1 - num2; this.multiply = num1 * num2; } public int getAdd() { return add; } public int getMinus() { return minus; } public int getMultiply() { return multiply; } }  ExController.java@RestController public class ExController { @GetMapping("/api/v1/calc") public CalculatorResponse plusMinusMultiplyCalculator(@RequestParam int num1, int num2) { return new CalculatorResponse(num1, num2); } } Response문제2ExController.java@RestController public class ExController { @GetMapping("/api/v1/day-of-the-week") public DateResponse dayOfTheWeek(@RequestParam String date) { return new DateResponse(date); } } DataResponse.java public class DateResponse { private Enum<DayOfWeek> dayOfTheWeek; public DateResponse(String date) { LocalDate parsed = LocalDate.parse(date); this.dayOfTheWeek = parsed.getDayOfWeek(); } public Enum<DayOfWeek> getDayOfTheWeek() { return dayOfTheWeek; } }  GET 메서드에서 파라미터의 value의 타입은 문자열로 들어오므로 DateResponse의 생성자에서 LocalDate.parse()를 통해 문자열을 LocalDate로 바꿔주었다. 문제3 ExController.java@RestController public class ExController { @PostMapping("/api/v1/multi-number-sum") public int multiNumberSum(@RequestBody CalculatorMultiNumber request) { int[] numbers = request.getNumbers(); int sum = Arrays.stream(numbers).sum(); return sum; } } CalculatorMultiNumber.javapublic class CalculatorMultiNumber { int[] numbers = new int[5]; public int[] getNumbers() { return numbers; } } ResponseResponse크기가 5개인 배열을 선언 하고 body에 길이가 6개를 리스트 넣고 요청해도 6개의 값을 반환한 값을 돌려준다.왜 그런지 이유를 찾고 싶었는데 못찾았다 ㅠㅠ 3일차람다식은 익명 클래스를 좀 더 쉽게 쓸 수 있게 자바8부터 도입된 개념이다. OOP인 자바는 람다식의 도입으로 함수형 프로그래밍도 가능해졌다하루에 몰아서 적으려니까 너무 힘들었다 다음주 회고록은 따로 초고를 그날 그날 적어놔야겠다..이 블로그에 올린 코드와 문제의 출처는 https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90입니다  

백엔드java인프런워밍업클럽스프링spring자바

[인프런 워밍업 클럽 스터디] 13일차 - Spring Boot 설정, 버전업 이해하기

build.gradle빌드 스크립트라고도 불리며, gradle을 이용해 프로젝트를 빌드하고 의존성을 관리하기 위해 작성되었다.groovy 언어를 사용해 작성되었고, Kotlin이라는 언어를 사용할 수도 있다. org.springframework.boot 플러그인 역할스프링을 빌드했을 때 실행가능한 jar 파일이 나오게 도와주고스프링 애플리케이션을 실행할 수 있게 도와주고또 다른 플러그인들이 잘 적용될 수 있게 해준다. Spring 과 Spring Boot 의 차이점1. 간편한 설정2. 간단한 의존성 관리3. 강력한 확장성MSA에 적합한 모니터링  Lombokgetter, setter, 생성자와 같은 반복되는 보일러 플레이트 코드(boiler plate code)를 제거할 수 있다.lombok 의존성 추가IntelliJ lombok 플러그인 추가IntelliJ Annotation Processor 설정   Spring Boot 2.7.x 에서 3.0.x 로 업데이트 하기Java 최소 버전이 17로 업그레이드 되었다.많은 스프링 프로젝트, Thrid-party Library 가 버전업 되었다.AOT 기초 작업이 이루어졌다. AOT(Ahead of Time) 빌드를 할 때 스프링 애플리케이션을 분석하고 최적화하는 도구애플리케이션 시작 시간과 메모리 사용량을 줄일 수 있게 해준다.javax 대신 jakarta 패키지를 사용하게 된다.모니터링 기능들의 강화외의 다양한 세부적인 변경사항이 많음   

백엔드워밍업클럽스터디백엔드자바스프링부트

[인프런 워밍업 클럽 스터디] 12일차 - AWS와 EC2 배포

Section 7. 생애 최초 배포하기[목표]EC2에 접속하는 방법을 알아보고, EC2에 접속해 리눅스 명령어를 다뤄본다.개발한 서버의 배포를 위해 환경 셋팅을 리눅스에서 진행하고, 실제 배포를 진행한다.foreground와 background의 차이를 이해하고 background 서버를 제어한다.도메인 이름을 사용해 사용자가 IP 대신 이름으로 접속할 수 있도록 한다.[리눅스 기본 명령어]mkdir : 폴더를 만드는 명령어ls : 현재 위치에서 폴더나 파일을 확인하는 명령어ls -l : 조금 더 자세한 정보를 확인할 수 있다.cd : 폴더 안으로 들어가는 명령어pwd : 현재 위치를 확인하는 명령어cd .. : 상위 폴더로 올라가는 명령어rmdir : 비어있는 폴더(디렉토리)를 제거하는 명령어 sudo yum update : 관리자의 권한으로 설치되어 있는 여러 프로그램을 최신화한다.sudo yum install [프로그램이름] : 관리자의 권한으로 프로그램을 설치한다.sudo systemctl status [프로그램이름] : 프로그램의 상태를 확인한다.suto systemctl restart [프로그램이름] : 프로그램을 재시작한다.chmod : 파일이나 폴더의 권한을 변경한다.ctrl + c : foreground로 실행중인 프로그램을 중단하는 신호nohup [명령어] & : [명령어]를 background에서 동작하게 만드는 명령어rm : 파일을 제거하는 명령어 ps aux : 현재 실행중인 프로그램 목록을 확인할 수 있다. kill -9 [프로그램번호] : 해당 프로그램을 종료시킨다. vi : 리눅스 편집기인 vim을 사용하여 파일을 연다.cat : 파일에 있는 내용물을 모두 출력하는 명령어 tail : 현재 파일의 끝 부분을 출력하는 명령어 tail -f : 현재 파일의 끝 부분을 실시간으로 출력해준다.      

백엔드워밍업클럽스터디백엔드자바스프링부트

[인프런 워밍업 클럽 스터디] 10일차 - 객체지향과 JPA 연관관계

[1 : 1 관계][연관관계의 주인]Table을 보았을 때 누가 관계의 주도권을 가지고 있는가연관관계의 주인이 아닌 쪽에 mappedBy 옵션을 달아 주어야 한다.연관관계의 주인의 값이 설정되어야만 진정한 데이터가 저장된다.객체가 연결되는 기준이 된다. [연관관계의 주인 효과]상대 테이블을 참조하고 있으면 연관관계의 주인연관관계의 주인이 아니면 mappedBy를 사용연관관계의 주인의 setter가 사용되어야만 테이블 연결 [N : 1 관계] - @ManyToOne 과 @OneTOMany@JoinColumn연관관계의 주인이 활용할 수 있는 어노테이션.필드의 이름이나 null 여부, 유일성 여부, 업데이트 여부 등을 지정 [N : M 관계] - @ManyToMany구조가 봅잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 추천 cascade 옵션 : 한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능orphanRemoval 옵션: 객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션  [연관관계 정리]상대 테이블을 가리키는 테이블이 연관관계의 주인이다. 연관관계의 주인이 아닌 객체는 mappedBy를 통해 주인에게 매여 있음을 표히새 주어야 한다.양쪽 모두 연관관계를 갖고 있을 때는 양쪽 모두 한 번에 맺어주는게 좋다.cascade 옵션을 활용하면, 저장이나 삭제를 할 때 연관관계에 놓인 테이블까지 함께 저장 또는 삭제가 이루어진다.orphanRemoval 옵션을 활용하면, 연관관계가 끊어진 데이터를 자동으로 제거해준다.  [연관관계를 사용하면 무엇이 좋을까?]각자의 역할에 집중하게 된다.(응집성)새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.테스트 코드 작성이 쉬워진다.[연관관계를 사용하는 것이 항상 좋을까?]지나치게 사용하면, 성능상의 문제가 생길 수도 있고 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.또한 너무 얽혀 있으면, A를 수정했을 때 B, C, D 까지 영향을 받을 수 있다.그렇기 때문에 비즈니스 요구사항, 기술적인 요구사항, 도메인 아키텍처 등 여러 부분을 고민해서 연관관계 사용을 선택해야 한다.  Section 5. 정리책 생성, 대출, 반납 API를 온전히 개발하며 지금까지 다루었던 모든 개념을 실습해본다.객체지향적으로 설계하기 위한 연관관계를 이해하고, 연관관계의 다양한 옵션에 대해 이해한다.JPA에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점을 이해한다.   

백엔드워밍업클럽스터디백엔드자바스프링부트

[인프런 워밍업 클럽 스터디] 7일차 - Spring Data JPA를 사용한 데이터베이스

Section 4. 생애 최초 JPA 사용하기[목표]문자열 SQL을 직접 사용하는 것의 한계를 이해하고, 해결책인 JPA, Hibernate, Spring Data JPA가 무엇인지 이해한다.Spring Data JPA를 이용해 데이터를 생성, 조회, 수정, 삭제할 수 있다.트랜잭션이 왜 필요한지 이해하고, 스프링에서 트랜잭션을 제어하는 방법을 익힌다.영속성 컨텍스트와 트랜잭션의 관계를 이해하고, 영속성 컨텍스트의 특징을 알아본다.[SQL을 직접 작성하면 아쉬운 점]문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다.특정 데이터베이스에 종속적이게 된다.반복 작업이 많아진다. 테이블을 하나 만들 때 마다 CRUD 쿼리가 항상 필요하다.데이터베이스의 테이블과 객체는 패러다임이 다르다.===> 그렇기 때문에 등장한 것이 JPA(Java Persistence API) [JPA란?]객체와 관계형 DB의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙이것을 코드로 구현한 것이 Hibernate. Hibernate는 JDBC를 내부적으로 사용한다. [JPA 어노테이션]@Entity : 스프링이 User 객체와 user 테이블을 같은 것으로 바라본다.  기본생성자 꼭 필요함.@Id : 이 필드를 primary key로 간주한다.@GeneratedValue : primary key는 자동 생성되는 값이다.@Column : 객체의 필드와 Table의 필드를 매핑한다. 이름이 같을 시 생략 가능. [spring.jpa.hibernate.ddl-auto]create: 기존 테이블이 있다면 삭제 후 다시 생성create-drop: 스프링이 종료될 때 테이블을 모두 제거update: 객체와 테이블이 다른 부분만 변경validate: 객체와 테이블이 동일한지 확인none: 별다른 조치를 하지 않는다 [지금까지 사용한 JPA Repository 기능]save: 주어지는 객체를 저장하거나 업데이트 시켜준다.findAll: 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.findById: id를 기준으로 특정한 1개의 데이터를 가져온다. [Spring Data JPA]복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리 [JPA Repository에서 By 앞에 들어갈 수 있는 구절 정리]find: 1건을 가져온다. 반환 타입은 객체가 될 수도 있고, Optional<타입>이 될 수도 있다.findAll: 쿼리의 결과물이 N개인 경우 사용. List<타입> 반환.exists: 쿼리 결과가 존재하는지 확인. 반환 타입은 boolean.count: SQL의 결과 개수를 센다. 반환 타입은 long. [JPA Repository에서 By 뒤에 들어갈 수 있는 구절 정리]GraterThan: 초과GraterThanEqual: 이상LessThan: 미만LessThanEqual: 이하Between: 사이에StartsWith: ~로 시작하는EndsWith: ~로 끝나는  [과제]진도표 7일차와 연결됩니다우리는 JPA라는 개념을 배우고 유저 테이블에 JPA를 적용해 보았습니다. 몇 가지 문제를 통해 JPA를 연습해 봅시다! 🔥 

백엔드워밍업클럽스터디백엔드자바스프링부트

[인프런 워밍업 클럽 스터디] 6일차 - 스프링 컨테이너의 의미와 사용 방법

[정리] Section 3. 역할의 분리와 스프링 컨테이너좋은 코드가 왜 중요한지 이해하고, 원래 있던 Controller 코드를 보다 좋은 코드로 리팩토링 한다.스프링 컨테이너와 스프링 빈이 무엇인지 이해한다.스프링 컨테이너가 왜 필요한지, 좋은 코드와 어떻게 연관이 있는지 이해한다.스프링 빈을 다루는 여러 방법을 이해한다.  클래스 : 객체를 정의해놓은 설계도. 객체를 생성하기 위해 사용된다.객체 : 클래스에 정의된 내용이 인스턴스화되어 실제로 생성된 것. 설계도를 통해 만들어진 집.인스턴스(화) : 클래스를 실제로 사용할 수 있도록 생성하는 것. 스프링 빈 (UserController에 @RestController를 붙여줌으로써 스프링 빈이 됨)서버가 시작되면 스프링 서버 내부에 거대한 컨테이너(클래스 저장소)를 만든다.컨테이너 안에는 클래스가 들어간다.이 때 다양한 정보도 함께 들어있고, 인스턴스화도 이루어진다.이때 스프링 컨테이너 안으로 들어간 클래스를 스프링 빈이라고 한다.JdbcTemplate도 스프링 빈으로 등록되어 있다. (Dependency가 등록해 주고 있음)스프링 컨테이너는 필요한 클래스를 연결해준다.  서버가 시작되면 일어나는 일스프링 컨테이너(클래스 저장소)가 시작된다.기본적으로 많은 스프링 빈들이 등록된다.우리가 설정해 준 스프링 빈이 등록된다.이 때 필요한 의존성이 자동으로 설정된다. 스프링 빈을 등록하는 방법@Configuration클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용해야 한다.  @Bean메소드에 붙이는 어노테이션메소드에서 반환되는 객체를 스프링 빈에 등록한다. @Service - @Repository 사용할 때 개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때  @Configuration - @Bean 사용할 때외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때알아볼 어노테이션@Component주어진 클래스를 '컴포넌트'로 간주한다. 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.@Qualifier스프링 빈에 이름을 지정함으로써 특정 클래스를 가져옴 스프링 빈을 가져오는 방법(가장 권장) 생성자를 이용해 주입받는 방식 : @Autowired 생략 가능setter와 @Autowired 사용 : 누군가 setter를 사용하면 오작동 할 수 있다.필드에 직접 @Autowired 사용 : 테스트를 어렵게 만드는 요인이다.   참고자료 : https://mihee0703.tistory.com/182 

백엔드워밍업클럽스터디백엔드자바스프링부트

[인프런 워밍업 클럽 스터디] 4일차 - 데이터베이스를 사용해 만드는 API

 [이론 정리]생애 최초 database 조작하기디스크와 메모리 차이를 이해하고, Database의 필요성을 이해한다.SQL을 이용해 MySQL Database를 조작할 수 있다.스프링 서버를 이용해 Database에 접근하고 데이터를 저장, 조회, 업데이트, 삭제할 수 있다.API의 예외 상황을 알아보고 예외를 처리할 수 있다.  [과제]문제 1우리는 작은 과일 가게를 운영하고 있습니다. 과일 가게에 입고된 "과일 정보"를 저장하는 API를 만들어 봅시다. 스펙은 다음과 같습니다.HTTP method : POSTHTTP path : /api/v1/fruitHTTP 요청 Body { "name" : String, "warehousingDate" : LocalDate, "price" : long }HTTP 요청 Body 예시 { "name" : "사과", "warehousingDate" : "2024-02-01", "price" : 5000 }응답 : 성공시 200 💡한 걸음 더!자바에서 정수를 다루는 가장 대표적인 두 가지 방법은 int와 long입니다.이 두 가지 방법 중 위 API에서 long을 사용한 이유는 무엇일까요?  문제 2과일이 팔리게 되면, 우리 시스템에 팔린 과일 정보를 기록해야 합니다. 스펙은 다음과 같습니다.HTTP method : PUTHTTP path : /api/v1/fruitHTTP 요청 Body{ "id" : long }HTTP 요청 Body 예시 { "id" : 3 }응답 : 성공시 200  문제 3우리는 특정 과일을 기준으로 팔린 금액, 팔리지 않은 금액을 조회하고 싶습니다.예를 들어(1, 사과, 3000원, 판매O)(2, 사과, 4000원, 판매X)(3, 사과, 3000원, 판매O)와 같은 세 데이터가 있다면 우리의 API는 판매된 금액 : 6000원, 판매되지 않은 금액 : 4000원 이라고 응답해야 합니다.구체적인 스펙은 다음과 같습니다.HTTP method : GETHTTP path : /api/v1/fruit/statHTTP query- name : 과일 이름예시 GET /api/v1/fruit/stat?name=사과HTTP 응답 Body{ "salesAmount" : long, "notSalesAmount" : long }HTTP 응답 Body 예시 { "salesAmount" : 6000, "notSalesAmount" : 4000 }💡한 걸음 더!(문제 3번을 모두 푸셨다면) SQL의 sum, group by 키워드를 검색해 적용해보세요.   

백엔드워밍업클럽스터디백엔드자바스프링부트

채널톡 아이콘