블로그

[인프런 워밍업 클럽 스터디] 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에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점을 이해한다.   

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

라이프웨어

[기획물] 아직 꿈과 목표를 설정 못하셨나요? 이 글 하나로 끝내세요.

꿈과 장기적 목표를 가지고 계신가요?여러분은 생각하는 대로 살고 계신가요 혹은 사는대로 생각하고 계신가요프랑스 소설가 폴 부르제는 '생각하는 대로 살지 않으면, 사는 대로 생각하게 된다'는 말을 남겼습니다. 우리 주변에서 얼마나 많은 사람들이 장기적인 꿈과 목표를 가지고 살아가고 있을까요? 경험적으로 보았을 때 10-20%가 채 되지 않는 것 같습니다. 학교의 일, 직장의 일, 가족의 일, 당장 먹고 살기도 바빠 내 미래와 자신을 되돌아 볼 여유가 마땅하지 않습니다.하지만 분명한 것은 뛰어난 성과를 만들고 영향력을 가진 사람들은 인생의 비전과 장기적 목표를 가지는 사례가 자주 관찰 된다는 것입니다. 오프라 윈프리도 목표를 반복적으로 무의식화 하는 것을 강조합니다. 손정의 역시 10년 단위로 인생 목표를 수립한 것으로 유명하죠.  꿈과 장기적 목표를 굳이 가져야 하나요?라이프웨어에서 발견한 꿈과 장기적 목표의 가치는 그 실용성에 있습니다.첫번째는 인생에서 중요한 선택들을 올바르게 하기 위함입니다.진로 결정, 커리어와 취직 결정, 사업 및 투자 결정, 결혼 결정, 출산 및 육아 결정, 노후 결정우리는 살아가면서 인생에 큰 영향을 주는 결정들을 마주하게 됩니다. 외부 압력 등에 의해 내게 맞지 않는 결정을 내릴 땐 스트레스가 심하거나 돌아와야 하는 경우도 발생합니다. 장기적 관점에서의 올바른 결정은 우리의 삶이 당당하게 나아가도록 돕습니다. 두번째는, (역설적이게도) 지금 주어진 일을 더 잘할 수 있기 때문입니다.'Why에서 시작해라''Start with why', 'Leaders Eat Last', 'The Infinite Game' 등의 책으로도 유명한 Simon Sinek의 메시지 입니다. 회사 레벨에서 언급한 내용이었지만 우리 삶에도 동일하게 적용될 수 있습니다. 우리가 주어진 일을 하는 상황에도 회사와 내 목표 관점에서 이 일의 중요성을 이해한다면 더 적합한 결과를 만들고 더 높은 동기부여를 가지게 됩니다.따라서 역설적이게도 장기적 꿈과 목표는 현재 하는 일을 더 잘할 수 있게 만들어 줍니다. Source: 타임 북스 채널 / Ted Talk  - Simon Sinek: Start with Why  목표는 어떻게 만들고 어떻게 활용하죠?장기에서 단기 목표로 쪼개어 수립하고 지속적인 노출로 무의식에 각인시킵니다.이 원리는 장기목표를 성공적으로 활용하고 있는 사람들을 분석했을 때 나타나는 공통점입니다.Source: LifeWare 목표관리 시스템 원리 첫번째, '인생의 한문장'에서 시작하여 '10년 -> 1년 -> 1개월 -> 1주'로 쪼개어 내려오기너무 커서 잘 보이지 않는 장기 목표를 수립할 땐 손에 잡히게 단순화 시키는 것이 중요합니다. 따라서 목표 수립시엔 '내 인생의 한문장'을 정의하는 것에서 시작하는 것이 좋습니다.만약 인생 한문장을 만드는 것이 막막하다면 다음 포맷을 활용하시는 것을 권합니다. 나 [이름]은 [수단]으로 [대상]에게 [가치]를 제공하는 삶을 살 것이다Source: LifeWare 목표관리 시스템 - 인생의 한문장 Template다음으로 10년단위 목표를 수립합니다. 이 목표들은 진로, 커리어, 결혼 및 육아와 같은 라이프사이클 상 이벤트일 수도 있고, 자산 수준 및 매출액과 같은 재무적 목표일 수도 있습니다.그리고 현 시점의 10년 단위를 선택해 이를 1년 단위로 다시 쪼개어 기록합니다. 현재 30대라면 현재 나이부터 39살까지의 목표를 기록하여 최종적으로 30대의 목표에 도달하도록 합니다.1개월 단위 그리고 1주 단위의 목표도 마찬가지로 현재 구간의 목표를 세분화 합니다. 1달 1주 단위로 목표가 구체화 되면 내가 무엇을 해야 하는지 손에 잡히는 형태로 나옵니다. 목표는 동기 부여를 발생시킬 수 있도록 어느 정도 도전적인 수준이 좋습니다.  단기 목표 수립 Template">Source: LifeWare 목표관리 시스템 - 장기 > 단기 목표 수립 Template 두번째, 시각적 / 청각적 / 언어적으로 목표를 지속적으로 노출시키기장기적인 목표는 무의식에 큰 영향을 미칩니다. 평소 95% 이상의 정보처리와 의사결정은 무의식에서 발생합니다. 우리가 무의식을 원하는 방향으로 세팅할 수 있다면  삶은 내가 기대하는 목표로 더 빠르게 나아갈 수 있습니다. 즉, 의식적인 노력만 기울이는 것은 95% 역량을 지닌 무의식을 놓치는 결과를 낳을 수도 있습니다.목표를 이룬 거장들은 인간의 의식의 한계와 무의식의 가능성을 이해하고 이용하고 있었습니다. 따라서 장기적으로 원하는 모습을 설정한 이후에는 대표적으로 '목표 한문장', '비전 보드', '자기암시문'을 활용해 지속적으로 무의식에 입력합니다.아래는 라이프웨어에서 제공하는 목표 한문장, 비전보드, 자기암시문의 예시입니다.인생 한문장: 내 가슴을 뛰게 하지만, 단순하여 반복적으로 되뇌일 수 있은 인생의 한문장을 만듭니다.Source: LifeWare 목표관리 시스템 - 인생의 한문장비전 보드: 내가 원하는 미래의 모습을 상상할 수 있도록 관련 이미지들을 한 곳에 모읍니다.Source: LifeWare 목표관리 시스템 - 비전 보드자기 암시문: 매일 들을 수 있도록 나의 목표와 긍정의 확언들을 담아 자기 암시문을 녹음 파일을 만듭니다.  위 알려준 내용들을 가장 쉽게 하는 방법은 무엇이죠?아래에는 위에서 언급한 내용을 순서대로 따라해볼 수 있도록 정리하였습니다.1. 사용 중인 노트 앱에 위 내용을 참고하여 한 장짜리 목표 관리 페이지를 제작합니다.위 템플렛을 활용하여 목표 관리 페이지를 구성하시려면 아래 다운받기를 클릭해 주세요.[ 템플릿 다운받기 >> ]  (~3/17까지 무료 제공) 2. 인생 한문장을 기록합니다.내 가슴을 뛰게 만들고, 반복적으로 되뇌일 때 입에 착 감기는지를 기준으로 제작합니다.3. 10년 > 1년 > 1개월 > 1주 단위의 목표를 세분화 하여 기록합니다.10년 단위는 전부, 다음 부터는 현 시점에 해당하는 단위들을 기록합니다.(예를 들어 35살일 경우 1년 단위는 30대 부분, 월 단위는 35살의 3월~12월까지, 주 단위는 현재 월인 3월을 기록합니다) 그리고 위 현재 시점에 해당하는 목표들만 다시 눈에 잘 띄게 정리합니다.4. 비전 보드를 채웁니다. 그리고 스크린샷을 찍어 휴대폰, 노트북 바탕화면에 넣습니다.평소 시각적으로 자주 노출되도록 하는 것이 중요합니다. 자주 노출될 수록 무의식에 더 강하게 각인될 수 있습니다. 사진을 고를 때도 본인의 감정을 불러일으킬 수 있는 사진을 선택합니다.5. 자기 암시문 템플릿에 따라 스크립트 완성 후 녹음하고 바탕화면에 배치합니다.템플렛에 자신의 컨텐츠를 넣어 5분 이내의 자기암시문을 만듭니다. 필요시 '아침 시작시 명상문', '저녁 취침전 명상문' 등 여러 종류로 만들 수도 있습니다. GPT를 활용하여 명상문 스크립트를 제작할 수도 있습니다. FAQ1. 목표를 수립한 다음 어떻게 해야 할까요?다음으로 목표를 달성하는 단계입니다. 이때는 '루틴 관리'와 '핵심 결과물 설정 및 문제해결'을 통해 효과적으로 달성할 수 있습니다.1. 루틴 관리를 이해합니다: 실천하는 방법 중 꾸준히 수행해야 하는 일들이 있습니다. 원칙, 습관, 가치관 등은 모두 루틴의 종류들이죠. 어떻게 내 삶의 루틴을 체계적으로 수립하고 실행할 수 있는지 이해합니다.2. 핵심 결과물 설정 및 문제 해결을 이해합니다: 우리의 목표를 달성하기 위해 여러 중간 결과물 목표를 수립할 수 있습니다. 그리고 문제 해결을 통해 목표를 달성할 수 있습니다. 중간 핵심 결과물을 수립하고 문제해결을 수행하는 방법론을 배웁니다.각 부분에 대한 상세 내용들은 추후 라이프웨어 뉴스레터를 통해 공유드릴 수 있습니다. 뉴스레터를 구독하시면 양질의 컨텐츠와 유료 자료를 무료로 받아보실 수 있습니다.[라이프웨어 뉴스레터 구독하기>>] 2. 목표 관리 템플릿을 혼자 채우려니 어려워요. 어떻게 하면 좋을까요?목표 관리 시스템 관련하여 궁금한 부분이 있으시면 해당 게시물 (링크)에 댓글로 남겨주세요. 확인하고 답변 드리겠습니다.또한 라이프웨어에서는 함께 자신만의 라이프시스템을 만들어보는 프로그램을 3월 18일부터 4주 동안 진행할 예정입니다. 1주차에는 이 뉴스레터에서 다루었던 '목표 관리' 와 더불어 '루틴 관리' 를 다룹니다. 그 외 주차에는 핵심 결과물, 문제 해결력, 테스크, 피드백, 지식 관리 시스템 등을 다룰 예정입니다.관심 있으신 분께서는 아래 프로그램 소개 내용을 참고해 주세요[라이프웨어 프로그램 상세 보기 + 오픈 알림 신청하기>>]  오늘의 레터를 정리합니다.1. 꿈과 장기 목표는 실용적이다:  장기 목표를 통해 중요한 인생 결정을 올바르게 내릴 수 있고, 역설적으로 현실을 잘 살도록 돕습니다.2. 인간의 의식은 제한적이다: 사람들은 큰 목표를 다룰 힘이 없으니 손에 쥘 수 있을 정도로 작게 나누거나 무의식을 활용합니다.3. '장기에서 단기로', '지속적인 노출'을 활용한다: 인생 한문장>10년>1년>1개월>1주, 그리고 시각적/청각적/언어적으로 반복 노출시킵니다. 위 방법을 순서대로 따라할 수 있는 템플렛을 활용해 보세요. [ 템플렛 다운받기 >> ] (~3/17까지 무료 이벤트, 이후 유료 제공)  '나만의 라이프시스템'을 함께 만들어 보는 4주간의 라이프웨어 코호트 프로그램에 참여해 보세요. 현재 1기 오픈 알림을 받고 있어요.라이프웨어 1기는 라이프시스템 하위 시스템을 하나씩 경험하면서 삶을 변화 시킬 수 있는 프로그램으로 기획했어요. 1주차 목표 관리, 루틴 관리를 시작으로 핵심 결과물과 문제 해결(프로젝트) 관리 그리고 테스크와 피드백 관리, 지식 관리 등을 모두 다룰 예정이에요.알림 신청을 해주세요. Q. 라이프웨어는 무엇을 하는 곳인가요?삶을 변화 시키려면 무엇이 필요할까라는 고민과 연구로 이 프로그램이 탄생했어요. 자기계발 서적은 여전히 불티나게 팔리고 있지만 우리 삶은 변화가 더딘 것 같아요. 라이프웨어는 해답을 '핵심 원리가 담긴 컨텐츠와 라이프시스템'에서 찾고 있어요. 핵심 원리를 이해하고 시스템을 하나씩 적용하다보면 삶이 조금씩 변화해 가는 것을 발견하실 수 있을거에요. 그리고 꿈만 꿔왔던 목표들에 더 빠르게 가까워질 수 있을거에요.라이프웨어는 매주 뉴스레터를 통해 토픽을 하나씩 전달 드리는 것과 더불어 4주간의 집중 코호트 프로그램을 통해 시스템을 내재화하고 커스터마이징 하는 경험을 제공해 드리고 있어요. Q. 라이프웨어 코호트는 누구를 위한 프로그램인가요?자기계발 서적, 동영상 소비 대비 실제 삶의 변화가 많지 않다고 느끼는 분여러 생산성 도구를 사용하느라 불편하고 통합된 시스템을 만들고 싶은 분라이프웨어에서 소개한 컨텐츠를 혼자 적용하기에 어려움이 있고 시간이 오래 걸리는 분 Q. 프로그램의 핵심 구성은 어떻게 되나요?🙆‍♂ 적용 실습: 라이프시스템의 하위 시스템을 이해하고 실제 내 삶에 적용해 봅니다. (목표 관리, 루틴 관리, 핵심 결과물 관리, 문제 해결 관리(프로젝트), 테스크와 피드백, 지식 관리)👯‍♂ 그룹 러닝: 주 1회 온라인 그룹 러닝을 통해 자신의 시스템을 소개하고 피드백을 받습니다.🏗 DIY 제작: 스스로 노션 대시보드를 수정하는 방법을 배우고 실습합니다.📖 케이스 스터디: 라이프시스템을 성공적으로 사용하고 있는 사람들의 시스템을 분석하고 벤치마킹 포인트를 발견합니다. [라이프웨어 프로그램 상세 보기 + 오픈 알림 신청하기 >>]

기타 (커리어)목표관리꿈수립라이프시스템장기목표

[워밍업 스터디 클럽 0기 BE] 트랜잭션 이란?

✏️ (강의 링크 - https://inf.run/XKQg) 트랜잭션 이란?쪼갤 수 없는 업무의 최소 단위모든 SQL을 성공시키거나, 중간에 하나라도 실패하면 모두 실패시킴=> 즉 한 번에 성공시키거나 한 번에 실패시킨다.트랜잭션 시작하기start transaction;트랜잭션 정상 종료하기commit;트랜잭션 실패 처리(SQL 미반영)rollback; Spring에서 트랜잭션 적용하기@TransactionalSELECT 쿼리만 사용한다면, readOnly 옵션을 쓸 수 있다@Transactional(readOnly - true)IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.  영속성 컨텍스트 란?테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고,트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 특수 능력 4가지- 변경 감지 (Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.- 쓰기 지연: DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라,트랜잭션이 commit될 때 모아서 한 번만 날린다.- 1차 캐싱: ID를 기준으로 Entity를 기억User user1 = userRepository.findById(1L).get();ID가 1인 유저 조회 -> 영속성 컨텍스트가 1인 유저를 기억 - 지연 로딩: 꼭 필요한 순간에 데이터를 로딩한다. @Transactional public void returnBook(BookReturnRequest request) { User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); System.out.println("Hello"); user.returnBook(request.getBookName()); }

트랜잭션

한범석

인프런 워밍업 클럽 0기 - 백엔드 코스 (3주차 회고)

인프런 워밍업 클럽 3주차까지 마무리했습니다. 이번 주에는 JPA를 객체지향적으로 사용하는 방법과 실제 서버를 배포하는 방법, 설정 파일들에 대해 배울 수 있었습니다.하나의 강의를 들으면서 프로젝트 설정부터 개발, 실제 배포까지 배울 수 있어 알찬 구성이었던 것 같습니다.마지막 회고를 통해 배운 내용을 정리해보도록 하겠습니다. 10일차이전에 JPA를 활용해 개발을 했을 때 테이블의 연관관계를 그저 외래키를 Long타입으로 가지고 있는 형식으로 사용했습니다. 이렇게 사용하는 것은 그저 Table을 매핑해주는 역할로만 Jpa를 활용하고 있는 상태입니다.그러므로 테이블과 연결된 엔티티를 좀 더 객체지향적인 방식으로 사용할 수 있는 방법에 대해 알아보았습니다.테이블의 연관관계를 정의할 때 1:1, 1:N, N:M의 관계를 갖게 됩니다. 이를 좀 더 객체지향적인 방법으로 각 엔티티가 다른 엔티티를 연결시켜줄 수 있습니다.A, B엔티티가 1:1 연관관계를 가질 경우를 예로 들면, A 엔티티 클래스 안에 멤버 변수로 연결된 엔티티 B를 선언해주고 @OneToOne을 통해 1:1 연관관계를 맺고 있다는 것을 알려줍니다. 이 후 연관관계를 맺은 두 엔티티 중 연관관계의 주인을 정해주면 됩니다.연관관계의 주인은 해당 관계의 우위를 점하고 있다는 뜻이 아니라 어떤 엔티티가 외래키를 관리할지 결정해주는 것입니다.테이블에서는 연관관계를 외래키를 통해 맺고 단방향 연관관계만을 가집니다. 하지만, 엔티티와 같은 경우 연관관계를 갖는 엔티티가 양방향 연관관계를 맺을 경우가 있습니다. 이럴 경우 하나의 엔티티에서 연관관계를 끊거나 다른 엔티티로 변경되었을 경우 이를 실제 DB 테이블에 변경사항을 저장해야 합니다. 이럴 경우 연관관계의 주인을 통해 외래키를 변경하거나 제거함으로써 연관관계를 수정하도록 하는 것입니다.연관관계의 주인은 @JoinColumn으로 선언해줍니다. 양방향 연관관계를 가지고 연관관계의 주인이 아닌 쪽에는 mappedBy를 통해 연관관계의 주인을 알려줍니다. @OneToOne과 @ManyToOne은 Fetch 전략이 EAGER로 되어 있습니다. EAGER전략은 엔티티를 조회하면 연관된 엔티티도 함께 조인을 통해 조회하게 됩니다. 이럴 경우 의도치 않은 join문이 발생하기도 하고, 또한 가장 안 좋은 경우인 N+1개의 쿼리가 발생하는 경우도 발생하게 됩니다. 그렇기 때문에 우선 Fetch 전략은 모두 LAZY로 변경하는 것이 최적화를 위한 좋은 방법입니다. 11일차현재 서버는 로컬에 배포된 상태로 이 서버에 접근하기 위해서는 실제 제가 있는 집에 방문해 보는 것 밖에 없습니다.그러므로 이 서버를 실제 여러 사람들에게 공개하기 위해서는 다른 사람들이 접근할 수 있는 컴퓨팅 시스템에 이를 노출시켜야 합니다. 이러한 컴퓨팅 자원을 원하는 만큼 제공해주는 것을 클라우드 서비스 중 하나인 IaaS라고 합니다.IaaS를 제공하는 회사 중 하나인 AWS의 무료 인스턴스를 통해 웹 서버 배포를 시도해보았습니다. 우선 웹 서버의 ip를 할당받고 포트포워딩을 통해 ssh 접속을 시도하거나 웹서버 접근을 위한 포트를 열어줍니다.또한, 빌린 인스턴스에서 서버를 동작시키기 위해서는 현재 작성한 코드를 전부 인스턴스로 이동시켜야 합니다. 모든 코드를 수동으로 전송하는 것은 굉장히 비효율적인 작업이므로 이를 해소하기 위해서 분산 버전 관리 툴인 Git과 GitHub를 이용해보도록 하겠습니다. 12일차AWS를 통해 EC2 인스턴스를 받은 다음, 배포에 필요한 Git, Java, MySQL 등을 설치해줍니다.그리고 GitHub를 통해 지금까지 작성한 코드를 git pull을 통해 받습니다.인스턴스 내에서 코드를 빌드하고 실행시킨다면 해당 인스턴스의 ip주소를 통해 접속이 가능해집니다.또한, 백그라운드 실행을 통해 해당 인스턴스에 대한 ssh접속이 끊어져도 실행이 계속되도록 유지시킬 수 있습니다. 13일차build.gradle의 여러 설정들에 대해 알아보았습니다.Spring 프레임워크를 사용하기 위해서는 트랜잭션, 톰캣, 다른 라이브러리들을 위한 설정들을 xml문법으로 작성해주어야 했습니다. 이러한 불편함을 해소하기 위해 여러 설정들을 자동으로 도와주고, 메이저 라이브러리일 경우 starter를 통해 버전을 작성하지 않더라도 알아서 호환되는 버전으로 사용하도록 도와주는 Spring Boot가 사용되고 있습니다. Spring Boot는 xml 뿐만 아니라 yaml이라는 마크업 언어를 통해 설정을 작성할 수 있습니다. 롬복은 getter나 setter 등 반복적으로 나타나는 코드를 어노테이션 형식으로 지원해주는 기능입니다. Spring Boot나 다른 프레임워크의 버전 업을 시도할 경우 변경해줘야 하는 부분은 무엇인지 차근히 확인하고 변경해주는 것이 좋을 것이다.Spring Boot가 3.0.0으로 넘어오면서 변경된 점은 Java의 최신 버전이 17로 업그레이드 되었고 javax 대신 jakarta 패키지를 사용하게 됐습니다. 이렇게 변경된 점을 IDE나 build.gradle, 실제 코드에 모두 반영시켜야 되기 때문에 신중하게 작업해야될 것 같습니다. 미니 프로젝트https://github.com/beomseok37/practice-spring-boot/tree/main/company 14일차 & 진짜 후기이렇게 모든 강의를 마무리하게 되었습니다. 전반적인 백엔드 개발에 필요한 지식들을 얻어갈 수 있어 좋았습니다.저와 같은 경우에는 이전에 JPA에 관련된 강의도 조금 수강을 한터라 배운 내용을 점검하는 방식으로 진행했던 것 같습니다.Spring Boot를 활용하면서 Spring에 대한 정보보다도 다른 데이터베이스, 리눅스 문법, 설정 파일 등 다양한 지식을 얻을 수 있어 좋았습니다.이후에는 현재 배운 내용들과 함께 좀더 동적으로 쿼리를 다룰 수 있는 방법을 통해 개인 프로젝트를 진행하면서 실제 스프링 동작 원리에 대해서도 깊게 파해쳐보는 시간을 가져보려고 합니다.

백엔드인프런워밍업클럽3주차회고백엔드코스

[인프런 워밍업 클럽 스터디] 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를 연습해 봅시다! 🔥 

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

hmkim199

[워밍업 클럽 0기 BE] 2주차 발자국

학습 내용출처: 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]섹션 4. 생애 최초 JPA 사용하기문자열 SQL을 직접 작성하는 것의 단점문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다.특정 데이터베이스에 종속적이게 된다. 반복작업이 많아진다.데이터베이스의 테이블과 객체는 패러다임이 다르다. => 그래서 JPA가 등장! JPA란? Java Persistence API의 약자로 자바 진영의ORM(Object-Relational Mapping) 기술 표준을 의미.데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙Spring Data JPA4. 영속성 컨텍스트테이블과 매핑된 Entity 객체를 관리/보관하는 역할을 수행스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료변경 감지 (Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는명시적으로 save 를 해주지 않더라도 알아서 변경을 감지하여 저장쓰기 지연 : 트랜잭션이 commit 되는 시점에 SQL을 모아서 한 번만 수행1차 캐싱 : ID를 기준으로 Entity를 기억하는 기능지연 로딩: 필요한 순간에 연결되어 있는 객체를 가져온다. (fetch 옵션 LAZY, EAGER 중 @OneToMany는 LAZY가 기본)섹션 5. 책 요구사항 구현하기상대 테이블을 가리키는 테이블이 연관관계의 주인이다. 연관관계의 주인이 아닌 객체는 mappedBy 를 통해 주인에게 매여 있음을 표시해 주어야 한다.양쪽 모두 연관관계를 갖고 있을 때는 양쪽 모두 한 번에 맺어주는 게 좋다.cascade 옵션을 활용하면, 저장이나 삭제를 할 때 연관관계에 놓인 테이블까지 함께 저장 또는 삭제가 이루어진다.orphanRemoval 옵션을 활용하면, 연관관계가 끊어진 데이터를 자동으로 제거해 준다. 미션6일차7일차의존성 주입을 어디에서 어떻게 하는지를 강의를 들으며, 미션을 하면서 자연스럽게 익히게 되어서 좋았습니다. sql을 직접 사용하는 것과 JPA를 통한 변화가 어떤 차이가 있는지 코드 상으로 확인할 수 있어서 기존에 헷갈리고 불명확한 부분들이 또렷이 보여서 좋았습니다. 회고 및 목표이전에는 @OneToMany와 같은 애노테이션을 어디에 사용하는지, 왜 사용하는 지를 모르고 그냥 동작하게 만들기 위해서 썼는데 2주차 강의를 수강하면서 각 테이블끼리 객체지향적으로 연결시키면서 자연스럽게 이해할 수 있었던 것 같아서 의미있고 재밌게 느껴졌습니다. 영속성 컨텍스트도 어렵게 생각하다가 강의를 들으니 이해가 잘 되어서 좋았고 전반적인 스프링 부트 기술들에 대해 필요성과 관계성 등을 알게 되어 좋았습니다.3주차에는 미니 프로젝트를 하면서 배웠던 것들을 스스로 적용해보고 다시 복습하는 시간을 가지고 싶습니다.

백엔드SpringBootJAVABackend

[워밍업 스터디 클럽 0기 BE] 4강 정리 및 공부

(강의 링크 - https://inf.run/XKQg)최초 JPA 사용하기문자열 SQL을 직접 사용하는 것의 한계를 이해하고, 해결책인 JPA, Hibernate, Spring Data JPA가 무엇인지 이해한다.Spring Data JPA를 이용해 데이터를 생성, 조회, 수정, 삭제할 수 있다.트랜잭션이 왜 필요한지 이해하고, 스프릉에서 제어하는 방법을 익힌다.영속성 컨텍스트와 트랜잭션 관계를 이해하고, 영속성 컨텍스트의 특징을 알아본다.JPA(Java Persistence API): 자바 진영의 ORM (Object-Relational Mapping)* Persistence 영속성 : 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성=> 객체와 관계형 DB의 테이블을 짝지 데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙 -> HIBERNATE  JPA 어노테이션JPA를 사용하기 위해서는 기본 생성자가 꼭 필요하다.@ColumnColumn 어노테이션 자체를 생략할 수 있다. 완전히 동일하는 경우  application.ymlddl-auto: -> 스프링이 시작할 때 DB에 있는 테이블을 어떻게 처리할지: create -> 기존 테이블이 있다면 삭제 후 다시 생성: create-drop -> 종료될 때 테이블 모두 제거: update -> 객체와 테이블이 다른 부분만 변경: validate -> 객체와 테이블이 동일한지 확인: none -> 별다른 조치를 하지 않는다. show_sql -> JPA를 사용해 DB에 SQL을 날릴 때 SQL을 보여줄 것인가format_sql -> SQL을 보여줄 때 예쁘게 포맷팅 할 것인가dialect -> 이 옵션으로 DB를 특정하면 조금씩 다른 SQL을 수정해준다. 유저 저장 기능save 메소드에 객체를 넣어주면 INSERT SQL이 자동 / save 되고 난 후 id가 들어가있다. save : 주어지는 객체를 저장하거나 업데이트 시켜준다.findAll : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.findById : id를 기준으로 특정한 1개의 데이터를 가져온다.

Groot

워밍업 클럽 - 백엔드 2주차 발자국

자바와 스프링 부트로 생애 최초 서버 만들기 (링크) 강의를 스터디를 하며 남기는 두 번째 발자국(회고)입니다.2주차에서 학습한 내용2주차에서는 jdbc를 직접적으로 사용하며 sql문을 날리는 것이 아닌 Spring Data JPA를 이용해서 Repository를 구현하는 법을 배웠다. 다른 ORM 문서에서도 JPA라는 단어가 계속 등장했는데 이제는 이것이 뭐를 말하는지 정확하게 알게 되었다 ㅎㅎ. 데이터베이스는 전공 수업이랑 인턴십을 하며 많이 다뤄보아서 빠르게 이해하고 넘어갈 수 있었다.다른 프로젝트를 사용하며 python alchemy랑 node prisma와 같은 ORM을 써본 적이 있어서 트랜젝션이나 엔티티에 대한 맵핑을 더 수월하게 익힐 수 있었다. JPA를 다루며 오히려 Java에 대해 더 자세히 공부하게 됐다. Checked Exception처럼 JPA에서 쿼리들을 어떻게 처리하는지 정확하게 내부 동작을 알아야 하겠다는 생각이 들기도 했다. 모르고 쓴다면 오히려 명시적으로 SQL을 쓰는 것보다 못할 수도 있을 수도 있다는 생각도 든다. 미션집에 데스크탑이랑 노트북 둘 다를 이용해서 개발하다 보니 MySQL schema가 필요할 일이 많아서 push해서 관리하기도 하고 미니 프로젝트 환경 구성도 끝났다. 미리 배포 부분은 이미 아는 내용이 많아서 빠르게 넘기면서 수강했다. 보면서 서버 설정도 완료했다. 지금 AWS는 사용하고 있어서 강의를 그대로 따라갈 수 없었다.따로 Oracle Cloud를 가입해서 학습하며 새로 만들었다. 강의를 보며 필요한 패키지들을 깔아뒀다.MySql은 Docker로 설치해뒀다.외우기 쉽게 호스트 이름은 apple로 해뒀다. 앞으로 미니 프로젝트 배포까지 자동화해서 공유해보고자 한다!파이팅!

백엔드

joyjoy312

[인프런 워밍업클럽 0기 BE] 두 번째 발자국 (2주차 회고)

✔2주차 커리큘럼✔2주차 학습 요약6일차Controller를 인스턴스화하지 않고도 메서드를 호출할 수 있었던 이유, JdbcTemplate설정을 해주지 않아도 사용할 수 있었던 이유인 @RestController에 대해 학습하였다. 이것이 UserController를 API의 진입 지점으로 만들어주는 것 뿐 아닌, 이 클래스를 스프링 빈으로 등록시켜준다. 서버 시작 시 스프링 컨테이너를 만들고 이 컨테이너에 스프링 빈을 넣으며 인스턴스화도 함께 이뤄진다는 것에 대해 배우고, 스프링 빈을 다루는 여러 방법에 대해 학습하였다. 6일차 미션 - API 역할 분리7일차문자열 SQL의 한계에 대해 알아보며 이를 극복하기 위한 JPA의 등장과 Hibernate,Spring Data JPA 등의 이론적 내용을 학습하였다. 그리고 실제 Jdbc를 이용해 SQL문을 직접 작성하였던 코드를 리팩토링하여 Spring Data JPA를 이용해 편리하게 db를 다룰 수 있는 방법을 학습하였다. JPA를 이용해 데이터를 Create, Read, Update, Delete하는 것을 학습하였다.7일차 미션 - JPA 활용8일차트랜잭션이 무엇인지와 3가지 기본 명령어에 대해 알아보았다. 기존 서비스 코드에 @Transactional을 통해 적용해보고 이것을 선언하였을 시 영속성 컨텍스트라는 것이 어떻게 작용하는지, 영속성 컨텍스트의 4가지 특징이 무엇인지에 대하여 학습하였다. 4가지 중 하나인 변경 감지라는 기능은 기존코드처럼 엔터티를 저장할 때 save() 를 하지 않고도 변경을 감지하여 데이터베이스에 반영할 수 있게 해준다.9일차 지금까지 개발 실습과 이론을 통해 배웠던 모든 개념을 실습하기 위하여 책 등록, 대출, 반납 API를 개발해보는 것을 진행하였다. 데이터베이스 console에서 테이블을 생성하고 이것과 호환되는 객체를 @Entity를 통해 만드는 것부터 필요한 repository, dto, service, controller를 작성하여 API를 개발하였다. repository부분은 학습한 Spring Data JPA를 활용하여 이전 Jdbc코드보다 더욱 편리하게 개발할 수 있었다.✔회고강의를 들으며 개발을 해 나갈수록 하루 하루 성장하는 것이 느껴진다. 트랜잭션이나 영속성 컨텍스트같은 개념도 이전에는 조금 어렵게 느껴졌지만 강의에서 핵심적인 내용을 위주로 쉽게 알려주셔서 이해가 잘되고 기존에 남아있던 지식과 합쳐져 정리가 되는 것 같다.과제7의 경우 JPA를 활용한 코드로 리팩토링하는 것인데 스트림에 대해 더 공부해보고, 이를 이용하면 코드를 더 간결히 리팩토링할 수 있을 것 같다. queryDSL에 대해서도 알아보는 것이 좋다고 강사님이 말씀하셔서 이에 대해서도 공부해보고 싶다.남은 한 주도 기대가 된다 🙂 남은 과제는 미니프로젝트만을 남겨두고 있다.+ 이 인강이 끝나더라도 강사님의 스프링, 백엔드 강의를 더 듣고 싶다...

임형준

[인프런 워밍업 스터디 클럽] 0기 - 두번째 발자국

두번째 발자국이 글은 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고 인프런 워밍업 클럽에 참여하여 쓰는 두번째 회고록입니다.2주차 내용2주차에서는 스프링 컨테이너에 대해서 배우고 JPA를 통해 API를 만드는 방법을 배웠다.간단하게 요번주 수업 내용을 요약해보면 다음과 같다.Day 7 스프링 컨테이너의 의미와 사용 방법(19강 ~ 22강)여태까지의 개선들이 다 스프링 컨테이너와 빈을 설명하기 위한 것이란 걸 알았다.먼저, 의존한다라는 것의 정의를 알 수 있었다. 그리고, 왜 인스턴스를 생성하지 않았는데 Controller의 생성자에서 JdbcTemplate를 사용할 수 있는 이유를 알게 되었다.그 이유를 실제로 다른 곳(Repository)에 적용해나가면서 프로젝트를 또 개선해나가면서 스프링의 빈이 무엇인지 명확하게 알 수 있었다.Day 8 Spring Data JPA를 사용한 데이터베이스 조작(23강 ~ 26강)JPA를 왜 사용하는게 좋은지 그 이유에 대해서 알고 배워나가기 시작했다. 기본적인 Entity 정의하는 것과 일반적인 쿼리를 JPA에서는 어떻게 바뀌는 건지 알게 되었다.이 단원에서는 두가지 부분에서 얻어 가는게 있었다.최태현 선생님께서 JPA 로직 작성하실 때 setter를 안쓰고 updateName으로 메서드를 따로 만들었다. 최태현님의 유튜브 에서 setter를 사용하면 안되는 이유를 보게 되었다. 여태까지 와닿지가 않았었는데 안쓰는게 좋은 이유를 총망라해주셔서 너무 도움이 되었다. 특히 비지니스 로직과 테크니컬 로직에서의 setter 지양, 지향을 설명해주실 때 깨달음을 한 번 얻게 되었다. JPA를 사용하게 되면서 모던 자바 문법을 밥 먹듯이 사용하게 된다는 걸 알 수 있었다. 절대 그냥 넘어가면 안된다는 경각심을 다시 한번 깨우치게 됐다. Day 9 트랜잭션과 영속성 컨텍스트(27강 ~ 29강)트랜잭션에 대해서는 평소에 알고 있어서 무난했다.그런데 영속성 컨텍스트는 처음들었다. 굉장히 신기했었다.실습하면서 맨 처음에 다른 패키지의 @Transactional을 썼었었다. springframework에 있는 Transactional을 붙이자.Day 10 조금 더 복잡한 기능을 API로 구성하기(30강 ~ 32강)아예 처음부터 기능을 JPA를 사용해서 만들어보면서 체화하는 과정을 거쳤다. 인강을 먼저 보지 않고 내가 구현을 먼저 해봄으로써 마치 과제를 수행하듯이 하고 인강을 들으니 확실히 더 좋았다.그리고 조금 복잡한 로직이 있으면 최태현님의 영상에서 처럼 잘게 쪼개고 주석으로 적고 기능 구현 한다는 점에 초점을 맞춰서 보았다.과제과제 6여섯번째 과제: https://www.inflearn.com/blogs/6865인강에서 처럼 Controller-Service-Repository 로 나누어 보는 과제였다.과제 7일곱번째 과제: https://www.inflearn.com/blogs/6901공통 피드백을 듣고 단순히 문자열로 option 조건을 쓴 것을 enum class를 써서 바꿨다.public List<FruitsSpecificOptionPriceRespond> getSpecificOptionPriceFruits(String option, Long price) {        if (isNotSpecificPriceOption(option)) {            throw new IllegalArgumentException();       } ​        List<Fruit> fruits = new ArrayList<>(); ​        if (GTE.equals(option)) {            fruits =  fruitRepository.findByPriceGreaterThanEqualAndIsSold(price, false);       } ​        if (LTE.equals(option)) {            fruits =  fruitRepository.findByPriceLessThanEqualAndIsSold(price, false);       } ​        return convertToFruitsSpecificOptionPriceRespond(fruits);   }하지만, 딱 봐도 한 눈에 코드들이 읽히지가 않는다. 계속해서 한눈에 읽혀지는 코드를 지향해야 되겠다.

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

김희제

[인프런 워밍업 클럽_0기 BE] 두번째 발자국 남기기

강의 수강 요약6일차 Layered Architecture 만들기Spring Container 클래스 저장소로 들어간 클래스를 Spring Bean 이라고 한다. @Bean과 @Configuration을 사용해 객체를 스프링 빈에 등록할 수 있다.@Component를 사용해 클래스를 SpringBean에 등록할 수 있다.생성자를 통한 주입방식을 사용하는 것이 가장 권장된다. 7일차 JPAJPA가 인터페이스면 Hibernate가 구현체이다.@Transactional영속성 컨텍스트와 기능: 트렌젝션이 시작될 때 영속성 컨텍스트가 생겨나고, 데이터베이스 객체를 보다 잘 사용할 수 있게 해준다. 기능 : 변경감지, 쓰기지연, 1차캐싱, 지연로딩8일차 ~연관관계 구현관계의 주인은 1:N중 N이다.다수가 One의 id를 가지고 있으므로, Many가 주인이다.  간단한 회고엔티티를 작성하는 것이 너무 헷갈린다. 7일차까지는 단순히 따라가기만 하면 됐었는데, 미니프로젝트 과제가 시작되고, 나름 코드를 잘 짜려고 노력하다보니 toEntity와 같은 다양한 키워드들이 눈에 밟혀서 오래걸리는 것 같다..적용은 안했지만.. 미니 프로젝트를 중심으로 남은 강의를 잘 수강해보겠습니다! 미션 해결 과정여섯번째 과제: Layered Architecture 만들기링크 : https://github.com/heisje/Inflearn-warmup-club-study-0/blob/main/assignment/LayeredArchitecture.md부트캠프에서 프로젝트를 만들때 협업을 위해 관심사를 분리하던 것에 이름이 있단 것을 알고 놀랐다. JPA와 JDBC를 인터페이스로 통합하여 스프링빈 자동주입을 사용해서 구성해보았다.일곱번째 과제: 과일가게API작성하기쿼리를 JPA로 변경하는 것이 쉽지 않았다. @Query어노테이션을 사용하면, 내 기준으로 복잡해 보이는 메소드명을 줄이고 이해하기 좋은 쿼리로 작성할 수 있어 자주 애용할 것같다. 링크: https://github.com/heisje/Inflearn-warmup-club-study-0/blob/main/assignment/jpaFruitAPIs.md  

백엔드백엔드인프런워밍업클럽스터디

[인프런 워밍업 클럽 0기] BE 2주차 발자국

2주차 발자국 강의 2 - 1. 스프링 컨테이너의 의미와 사용 방법스프링 빈과 스프링 컨테이너가 무엇인지와 스프링 컨테이너와 좋은 코드와는 어떤 연관이 있는지 알아보는 단계입니다.2 - 2. Spring Data JPA를 사용한 데이터베이스 조작문자열 SQL의 한계에 대해 알아보고 이를 대체하기위한 JPA, Hibernate, Spring Data JPA에 대해 알아본뒤, Spring Data JPA를 이용해 데이터를 다뤄보는 단계입니다.2 - 3. 트랜잭션과 영속성 컨텍스트트랜잭션이 왜 필요한지 알아보고 스프링에서의 제어법과 영속성 컨텍스트의 특징을 알아보며 영속성 컨텍스트와 트랜잭션과의 관계를 알아보는 단계입니다.2 - 4. 조금 더 복잡한 기능을 API로 구성하기책 생성 API의 대출과 반납기능을 개발해보면서 지금까지 배워왔던 모든 개념을 이용하여 실습해보는 단계입니다.  강의 회고 Spring boot를 처음 접하면서 다양한 시도를 해보고 있지만, Java 자체가 오랜만이라 쉬이 되고있진 않는것 같아서 아쉽습니다. 강의 내용 자체와 구성은 너무 좋은데 완전히 소화하지 못하고 있어서 아쉬운 느낌입니다.   미션 2 - 1. 기존에 만들어 보았던 FruitController를 각 계층 Service와 Repository로 나누고 계층별로 나누었던 코드 중 FruitRepository를 FruitMemoryRepository와 FruitMySqlRepository로 나누고 @Primary 어노테이션을 활용해 스위칭을 해보는 미션입니다.기존의 강의를 들으며 최대한 시도해 보았고 자유롭지 않지만 어느정도 소화할 수 있게 되었습니다.2 - 2. 앞서 작성한 코드에 JPA를 적용해보고, 여태 가게에 입고되었던 과일들의 개수를 세는 API를 만드는 단계입니다.기존의 강의를 들으며 시도해 보았지만, 쉽지 않은 단계였습니다. 무언가 놓친게 있다고 생각해서 앞 강의들을 다시보고 시도해야겠습니다.  미션 회고 미션 주제가 좋았지만, 원활히 수행하지 못한것이 아쉽습니다. 분명 노력하면 수월해 지겠지만 여의치 않은게 무척 아쉽습니다.         

백엔드

이든

인프런 워밍업 스터디 클럽 0기 2주차 회고

인프런 워밍업 스터디 클럽 0기 1주차 회고 1. 강의 회고[6일차]스프링 컨테이너의 의미와 사용 방법에 대해 배웠습니다[7일차]Spring Data JPA를 사용한 데이터베이스 조작에 대해 배웠습니다 [8일차]트랜잭션과 영속성 컨텍스트에 대해 배웠습니다 [9일차]조금 더 복잡한 기능을 API로 구현했습니다[섹션 목표]1. 책 생성, 대출, 반납 API를 온전히 개발하며 지금까지 다루었던 모든 개념을 실습.2. 객체지향적으로 설계하기 위한 연관관계를 이해하고, 연관관계의 다양한 옵션에 대한 이해3. JPA에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점 이해. >학습을 하며 느꼈던 점강의를 들으며 자바 기초에 대해 더 공부해볼 필요가 있겠다고 느꼈고, 아직 완전한 이해를 하지 못해 미션을 하는데 어려움이 많았습니다. 다음 주 차 공부를 할 때에는 그 부분들에 대해 좀 더 알아보고 공부하고 이해해야겠다고 목표를 세워보았습니다. 2. 미션 회고>미션 해결을 하며 느꼈던 점강의 내용을 제대로 이해 하지도 못했는데, 감기에 걸려 진도와 과제에 약간의 브레이크가 걸려버렸다..그래도 최대한 이해하려 구글링과 사람들이 올려둔 Q&A를 적극 활용하여 과제를 최대한 해결해보려 노력하고 미니프로젝트를 시작해보려 노력하였다 !현실적으로 시간이 부족하지 않도록 최선을 다하기란 힘들다는 것을 느꼈다... 마지막 한 주는 그보다는 주어진 시간을 조금 더 알차게 활용하는 것을 목표로 해봐야겠다!😄

박설빈

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

2주차에서는 7일차에서 과제가 마무리되고 미니 프로젝트를 시작하는 주차다. 다음주에는 미니 프로젝트를 완성하는 것이 목표다.  6일차스프링 컨테이너에 대해 배웠다. 어렴풋이 알고 있던 스프링 컨테이너와 스프링 빈에 대해 명확히 알게 된 날이었다.4일차에서 만들었던 api들을 controller-service-repository 계층으로 나누어보았다. 강의에서 들었던 내용을 다시 복습하게 된 시간이었다. 앞으로 api를 구현하게 되면 이 구조가 자연스럽게 나올 수 있도록 더 연습을 해야할 것 같았다.6일차 미션 링크 7일차JPA에 관한 강의였다. 차근차근 jpa를 이용한 코드로 바꾸는 것을 따라하면서 어떻게 사용해야 할 지를 익혔다.6일차에 클린코드로 리팩토링한 코드를 다시 jpa를 이용한 코드로 리팩토링하는 미션이였다. 코드가 훨~씬 깔끔해져서 좋았고 구현할 때도 매우 편해서 좋았다. 천천히 코드를 발전해나가니 각 코드가 어떤 의미인지 더 잘 이해가 되었다.7일차 미션 링크 8일차트랜잭션에 대해 배웠다. 모두 성공하거나 모두 실패해야 하는 업무가 있을 때 묶어서 업무를 진행하기 위해 쓰는 것이 트랜잭션이였다. 너무 간단하게 쓸 수 있어서 좋았다. 트랜잭션과 관련된 영속성 컨텍스트에서도 배웠는데 코드에 도움이 되는 기능이 많아서 편리했다. [트랜잭션]쪼갤 수 없는 업무의 최소 단위 (모두 성공하거나 모두 실패!!)묶어서 저장된다는 의미 start transaction;commit;rollback; @Transactional 어노테이션을 사용한다. ※주의 : IOException과 같은 Checked Exception은 롤백이 일어나지 않는다. [영속성 컨텍스트]테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.1. 변경 감지2. 쓰기 지연 (한 번에 모아서 쓰기)3. 1차 캐싱 4. (네번째 특징은 다음 섹션에 알려주신다고 하셨다..) 9일차좀 더 복잡한 구조의 api를 만들어 보면서 여태 배워왔던 것을 복습해보는 과정이었다. 대출기능과 반납기능 api를 개발해보면서 연습했다.    

백엔드

김민구

인프런 워밍업 클럽 2주차 발자국

길었던 한 주를 마무리하며 발자국을 작성해보고자 한다.이번주는 스프링 컨테이너의 의미와 사용 방법 Spring Data JPA를 사용한 DB 조작 트랜잭션과 영속성 컨텍스트 조금 더 복잡한 기능을 API로 구성하기 객체지향과 JPA 연관관계 에 대해 학습하였다.학습한 내용을 요약해보자면 스프링 부트의 편리성, Spring Data JPA의 사용 이유와 편리성, 트랜잭션과 영속성 컨텍스트의 개념과 특징 JPA를 활용한 객체와 테이블간 연관관계 설정 이를 통한 객체지향 설계 라고 할 수 있을 거 같다.이번 주 학습을 하며 느꼈던 점은 Spring , JPA, Spring Data JPA 모두 편리하고 좋은 기술들이지만 이러한 기술들을 잘 활용하기 위해 중요한 것은 결국 java 를 잘 할줄 알아야 한다는 것이었다.강의를 들으면 컬렉션, Optional, 스트림, 람다와 같은 java 개념이 나오는데 이러한 개념들에 대해 부족하다보니 앞서 말한 기술들을 잘 활용하기 어려웠기 때문이다.그래서 다음주는 강의를 들으면서 컬렉션, Optional, 스트림, 람다와 같은 java 개념 학습을 병행하기로 하였다.강의를 듣고 차수에 맞는 과제들도 수행하였는데 layered architecture 설계와 JPA 기능을 활용과 API 작성에 관련한 것이었다.먼저 혼자 과제를 해보고 못푸는 것들에 대해선 인프런 워밍업 클럽에 참여하고 계신 다른 참여자들의 제출 코드를 보며 해결했다. 과제를 하며 느꼈던 점은 개념을 받아들이는 것과 받아들인 개념을 활용하는 것은 큰 차이가 있다는 것이었다.수업을 들으며 개념을 받아들이는 것엔 큰 어려움이 없었는데 막상 그 개념을 과제에 어떤 방식으로 활용할지를 생각하고 실제로 적용하는 것엔 큰 어려움이 있었기 때문이다. 마지막으로 이번주 회고를 하며 발자국 작성을 마치려고 한다.어느덧 인프런 워밍업 클럽을 시작한지 2주가 지나갔다. 가벼운 마음으로 인프런 워밍업 클럽을 시작했었는데 생각보다 많은 것을 얻고 있는 거 같다.인프런 워밍업 클럽을 시작했을 때와 지금의 나를 비교해보니 그러한 거 같다.(아직도 나아가야 할 길이 멀지만.. ㅎㅎ)앞으로 1주 조금 넘게 남았다. 이 기간 잘 마무리하고 지금보다 더 성장한 내가 될 수 있으면 좋겠다. 그럼 오늘 발자국 작성은 여기서 마친다.          

백엔드

7마리상어

[인프런 워밍업 클럽 BE 0기] 2주차 발자국

2주차에는 1주차에서 배운 내용들을 토대로 조금 더 많은 것들을 배워갈 수 있었다.  6일차스프링 컨테이너의 의미와 사용 방법  6일차에는 스프링 컨테이너가 무엇인지, 그리고 어떻게 사용하는 지에 대해 알게 되었다. 우리가 1주차 학습 때 배웠던 Controller에서 3단 분리하여 만들어진 Service와 Repository를 받아오는 과정에서 스프링 빈으로 등록하여 사용하면 따로 연결을 시켜주지 않더라도 필요하면 가져와서 사용할 수 있다는 것을 알게 되었고, 우리가 만든 클래스나 메소드들을 직접 등록해보면서 스프링 컨테이너에 대한 이해를 높일 수 있었다. 6일차 미션 (이전 미션에서 작성한 Controller코드 분리)앞서 작성한 Fruit Controller 코드를 직접 분리하면서 좀 더 좋은 코드를 만들어 볼 수 있었다. 미션을 통해 따라치기만 했던 Service나 Repository 코드를 직접 작성해 보았고, 그 과정을 통해 Controller의 분리에 대해 조금 더 익숙해진 것 같았다. 그리고 @Primary 어노테이션이나 @Qualify어노테이션을 통해 두 Repository를 바꿔가며 작동시킬 수 있도록 코드를 작성해보면서 더 좋은 코드를 만들어 낼 수 있었다. 7일차Spring Data JPA를 사용한 데이터베이스 조작이제까지는 JdbcTemplate를 사용하여 직접 sql 쿼리문을 작성하고, 실행했는데 이러한 것들을 더 쉽고, 편리하게 사용하기 위해 Spring Data JPA에 대해 배웠다. 그 과정에서 JpaRepository의 메소드인 save, delete 등을 알 수 있었고, 확실히 직접 쿼리문을 작성하는 것이 아니라 메소드를 통해서 DB에 접근하여 조작하니 쿼리문의 오타로 인한 실수도 줄어들고, 코드 작성하는 시간도 줄일 수 있어 도움이 되었다. 7일차 미션 (JPA 연습)이제 총 7가지의 미션도 마지막에 다다랐는데 마지막은 Spring Data JPA를 사용하여 이제껏 만들었던 코드를 리팩토링 하는 것이다. FruitController의 각각 기능들을 직접 SQL 쿼리문을 작성하는 것이 아닌 JpaRepository의 메소드를 가져와서 사용함으로써 기능들을 구현해볼 수 있었다. 그리고 객체와 관계의 매핑을 뜻하는 ORM을 통해 우리가 작성한 테이블을 Entity코드와 매핑하여 여러가지 추가하면서 연결 시킬 수 있었고, 그 과정에서 조금 어려움을 겪었는데 어려움을 겪은 만큼 스스로 더 많은 것을 알게 되었다고 느낄 수 있어 좋은 경험이 되었다.8일차트랜잭션과 영속성 컨텍스트만약, 메소드를 실행하다가 도중에 문제가 발생하면 코드는 이제까지 실행한 구문들을 유지한 채 에러를 던지게 된다. 그렇다면 우리가 원하지 않았던 것들도 저장될 수 있는데 그것을 위해 트랜잭션과 영속성 컨텍스트에 대해서 배우게 되었다. 트랜잭션은 쪼갤 수 없는 업무의 단위로 모든 SQL이 성공하거나 또는 SQL이 하나라도 실패하면 원상태로 롤백시키는 것이다. 덕분에 도중에 에러가 발생하더라도 DB가 엉망으로 될 일이 사라졌고, 추가적으로 테이블과 매핑된 Entity 객체를 관리 및 보관하는 역할을 가진 영속성 컨텍스트에 대한 4가지 특수한 능력에 대해 알게 되었다.9일차조금 더 복잡한 기능을 API로 구성하기이제까지 유저 관련 API를 작성하며 DB, 스프링 컨테이너, JPA 등 여러가지 많은 것 들을 배웠는데 이제 지금까지 배운 내용들을 토대로 책 관련 API를 하나 씩 작성해보았다. 유저 API와 책 API는 기능이 다르기 때문에 유저에서는 없었던 여러 기능들을 구현해 볼 수 있었고, 강의를 보기 이전에 API를 먼저 만들어보고 비교 함으로써 부족한 부분이 무엇이고, 어떻게 작성하면 더 좋은 지에 대해 알 수 있는 좋은 기회였다.10일차객체지향과 JPA 연관관계마지막 10일차에서는 우리가 이제까지 배운 것들의 마무리 부분으로 조금 더 객체지향적으로 개발하는 방법에 대해 알게 되었다. 그 과정에서 JPA 연관관계의 추가적인 기능들인 1대1, 1대다, 다대다와 같은 것들을 알 수 있었고, 직접 연관 시켜서 코드를 작성해보니 생각하는 과정에서는 조금 머리가 꼬였지만, 최종적으로 만들고 나서 부터는 코드가 훨씬 가독성이 좋게 작성되었음을 볼 수 있었다. 그 후 이제까지 작성한 API들을 마지막으로 수정하면서 API 작성에 대한 내용들은 끝마치게 되었다.회고벌써 스터디에 참여하고 2주가 지났는데 2주전의 나와 비교하면 정말 하늘과 땅 차이인 것 같다. 1주차에서 부족한 부분들을 2주차에서 배워갈 수 있었고, 공부를 하면 할 수록 새로운 개념들이 나와 역시 개발자의 공부는 끝이 없다는 것을 뼈저리게 느끼는 중이다. 그래도 1주차에 비해서 조금 더 강의에 집중하고, 궁금한 부분들에 대해 더 찾아보고 공부하면서, 조금 더 성장한 느낌이 들었고, 마지막 3주차까지 끝나고 나면 얼마나 변해있을지가 점점 궁금해졌다. 이제 미니 프로젝트를 조금씩 준비하고 있는데 이제까지 열심히 공부한 내용들을 바탕으로 프로젝트 1단계에 만족하지 않고, 계속 공부하면서 최대한 많이 완성해보고 싶다.

백엔드인프런워밍업클럽