블로그

이삭토스트

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

강의 수강10일차 - 객체지향과 JPA연관관계JPA를 사용하는 이유를 배우는 단계, 무려 연관관계와 지연로딩에 관한 내용이다.자바와 같이 JPA를 객체지향적으로 설계하기 위해 연관관계 매핑을 사용한다.처음에 N:1 과, 1:1, N:M,의 경우에 대해 배우게 된다. 더불어 참조 관계를 단방향, 양방향으로 보게되고 연관관계의 주인이라는 개념을 이해하기엔 복잡한 부분도 있었다.N:M은 문제가 N+1이라는 toString의 순환참조로 인해 재귀함수가 되는데 이 경우에는 N:M을 N:1, 1:1, 1:M으로 테이블 하나를 중간다리 처럼 생성하여 나누는 것이 좋은 것으로 알고 있다.그리고 트랜잭션을 사용하고 있을 때, 한 쪽만 연결 해두면 반대 쪽은 알 수 없기에 각각의 setter를 연결해주는 방법을 이용하여 서로 알 수 있게 해주는 방법에 대해서 알게 되었다.또한 Fetch 옵션이 최적화에 밀접한 영향이 있고, 항상 연관관계를 사용하는 것이 좋은 것만은 아니기에 장단점을 잘 따져보고 사용하는 것이 좋겠다!11일차 - 기본적인 배포를 위한 준비Github와 AWS를 이용하여 우리가 만든 라이브러리 앱을 직접 외부에서 사용해볼 수 있게 하는 단계이다.프로파일을 적용시켜둬서 우리가 개발단계와 배포단계에서 사용하는 설정들을 미리 해둘 수 있다.AWS은 우리가 흔하게 접하게될 사이트다 유료 사이트이지만, 프리티어 내에서는 1년동안 자유롭게 사용가능하고 특별하게 사고를 치지 않는 이상은 별도의 요금은 발생하지 않을 것이다.12일차 - AWS와 EC2 배포본격적으로 AWS와 EC2를 사용해보는 시간이다.EC2는 리눅스를 사용하는데 개발자 분들이 알아야하는 것 중 리눅스 명령어들을 직접 사용해보는 시간이었다. 근데 뭔가 사용하는 명령어들이 ls, cd, pwd, cd, rmdir... 맥에 있는 터미널과 비슷하다는 느낌을 받는다...? 이 부분은 나중에 리눅스 운영체제 사용해보면서 경험해봐야겠다.Github에 올려둔 코드들을 어떻게 EC2에 올리는지 궁금했었는데 git clone을 이용하여 저장소 주소에 있는 파일들을 받아오는 방법이었다. 리눅스 swap 하는 방법을 통해서 메모리가 부족할 때 디스크 자체에서 대신하는 방법들을 배웠다 우리에게는 메모리 스왑 방식이 좀 더 익숙하긴 한데 비슷한 방식인 것 같다.빌드를 하고 방화벽 설정을 하고 그리고 실행중인 서버를 중단하고, EC2 콘솔을 닫아도 백그라운드에서 작동하는 방법네이버나 구글처럼, 아이피를 치고 들어가는 것이 아닌 도메인을 이용하여 DNS을 적용하는 방법 13일차 - Spring Boot 설정, 버전업 이해하기우리가 사용하는 스프링과 스프링부트에 관하여 좀 더 알아보는 시간 스프링이 어떻게 현재까지 이어져왔고 스프링부트로 인해 스프링을 좀 더 쉽게 쓰게 되었다.추가로 Lombok의 사용법도 배우면서 보일로 플레이트 코드를 줄이고 좀 더 깔끔하게 쓰는 방법에 대해서 배우게 되었다.미션 - 미니프로젝트 1차 모든 것이 처음부터 시작하는 상황으로 돌아가는 상황이다.먼저 테이블과 객체 설계부터 들어갔다.롬복을 사용해서 좀 더 깔끔하게 코드를 만들 수 있었다. public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long teamId; private String teamName; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long memberId; private String memberName; private boolean isManager; private LocalDate hireDate; private LocalDate brithDay; @ManyToOne @JoinColumn(name = "team_id") private Team team; 팀 등록기능과 직원 등록기능은 꽤 간단한 편이지만팀 전체적으로 조회 기능과, 직원 전체 기능을 조회하는 것이 꽤 난이도가 있었다.서로 하나만 쓰는 것도 아니고 동시에 같이 쓰기에 이것을 어떻게 처리할 것인가가 관건이었고둘 다 Response를 리스트로 보내기 위해서 객체들을 가져와서 새로 객체들을 만들어 리스트로 묶어줬다.다행인건 과제에서도 비슷한 과제가 존재하였기에 그나마 만들 수 있었던 것 같았다.@Transactional public List<GetAllMembersResponse> getAllMembers() { List<Member> members = memberRepository.findAll(); return members.stream() .map(this::mapToGetAllMembersResponse) .collect(Collectors.toList()); } private GetAllMembersResponse mapToGetAllMembersResponse(Member member) { GetAllMembersResponse response = new GetAllMembersResponse(); response.setName(member.getMemberName()); response.setTeamName(member.getTeam().getTeamName()); response.setRole(member.isManager() ? "MANAGER" : "MEMBER"); response.setBirthDay(member.getBirthDay()); response.setWorkStartDate(member.getHireDate()); return response; }순식간에 많은 내용을 배우면서 이 내용을 어떻게 써야할지 갈피를 못 잡는 것 보다단계적으로 상위 과제를 주면서 미니프로젝트를 완성해가는 것이 뭔가 뿌듯하다.아직 4단계 까지 남아있으니까 2단계 3단계 점차 나아가면서 마지막 배포 단계까지 열심히 작성해봐야겠다!

백엔드백엔드워밍업스터디BE1기회고록

이삭토스트

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

강의 수강6일차 - 스프링 컨테이너의 의미와 사용 방법우리가 설정해줘야 하는 부분들이 설정을 안 해줬는데도 작동하는 신기한 현상을 볼 수 있다.물론 정답은 스프링 부트에서 제공해주는 매우 편리한 기능(스프링 빈, 컨테이너)에 의한거지만 (개발자는 반복을 싫어한다.)또한 기기 자체에서 모듈방식을 채택하는 경우가 많은데 그것과 유사하게 스프링 내에서는Repository를 어떤 전략을 취할 것인지 선택하여 많은 변경이 없이 구조를 효과적으로 바꾸게 된다.스프링 컨테이너가 이 역할을 해주고 컨테이너가 서비스를 대신 인스턴스화하고, 그때마다 레포지토리를 결정해주는데 이 방식 자체를 IoC라고 한다.@Configuration과 @Component등 스프링에서 자주 쓰이는 어노테이션에 대해서 배우게 되는 시간이었던 것 같다.7일차 - Spring Data JPA를 사용한 데이터베이스 조작SQL에서 벗어나 드디어 JPA를 본격적으로 사용하게 되는 부분이다.JPA를 사용하기 위한 사전 설정과 Entity 클래스, 그리고 JPA를 사용할 때 가장 중요한 ddl_auto 이 부분이 실무에서는 매우 중요하다고 생각한다. (실무 데이터에서 validate빼고 사용한다면 데이터가, 변형 또는 날라가버리니까)가끔 일반적인 SQL 명령어에서 정밀하게 다루고자 할 때 JPA를 확장시켜둔 Repository에JPA 쿼리를 이용하여 다양한 쿼리를 작성해줄 수 있다. (조금 더 정밀하게 작동시키려면 JPQL이 답)8일차 - 트랜잭션과 영속성 컨텍스트트랜잭션의 개념에 대해 알아가는 구간, 영속성 컨텍스트 특징 (변경 감지, 쓰기 지연, 1차 캐싱, 지연로딩, 동일성 보장) 9일차 - 조금 더 복잡한 기능을 API로 구성하기User에서 벗어나 대출과 반납이라는 개념을 들어간다. 새로운 테이블을 만들고 두 테이블을 연결해서 사용하는 방법을 알게 되었다.그리고 마지막으로 JPA에서 연관관계 매핑에 관한 떡밥을 남기시며 다음 주 월요일을 기대하게 된다.미션6일차 과제 - 4일차 과제 API 분리, Controller - Service - Repository 계층에 익숙해지기 기존코드를 JPA를 이용하여리팩토링을 해나가는 과정이다.문제1 에서는 컨트롤러가 너무 많은 역할을 하고 있어 Controller(HTTP 관련 역할) - Service(분기 처리, 로직) - Repository(DB와 접근 담당)로 나누는 과정이며,문제2는 Repository를 인터페이스화 해서 메모리에 저장하는 부분과 MySql 저장하는 것을 선택하게끔 하는 것이었다.문제1은 기존 코드를 Controller에서 Service로 우선 나누고 그 다음에 Service에서 DB와 접근에 관련된 부분을 분리하여 Repository에 나누는등 3개로 분리하였다. 이 과정에서 JdbcTemplate를 Repository만 접근하므로 코드의 가독성을 늘리기 위해Repository를 제외하고는 JdbcTemplate 관련 설정을 지워줬다.문제2는 DIP에 관련된 내용으로 스프링에서 클래스에 의존하는 것이 아니라 인터페이스에 의존하게끔 만들어 의존성 역전 원칙을 만들게 하기 위함이다. (+ IoC)7일차 과제 - JPA 연습 문제1은 6일차 과제에서 만든 과제를 JdbcTemplate에서 Spring Data JPA를 사용하는 환경으로 바꿔주는 과정이다.JPA를 처음 접할 때 이걸 왜 사용하고 어떻게 사용해야하는지 몰랐다. 오히려 SQL 내용을 배우고나서 JPA로 천천히 넘어오니 사용방법과 필요성을 뼈저리게 느꼈다. 부트캠프에서는 처음 접하는 내용을 바로 활용하는 입장에 있어서 이해를 하지 못하고 급하게 넘어왔던 부분이었는데 지금 JPA를 다시 공부하면 깊게 배우면서 조금 더 내 실력을 늘릴 수 있을 것 같다. 자연스럽게 테이블에 대한 개념도 배우면서 어떤 곳에서 어떤 코드를 짜고 그 의문점에 대해서 해소 할 수 있는 과제 였다.문제2는 JPA를 적용해 놨다면 이제 새로운 기능을 JPA를 이용하여 만드는 것이다.조금 의아한거라면 JPA를 깊게 배워갈 수록 SQL의 필요성을 느끼게 되는 것 같다.문제3은 2가지 쿼리를 받아서 2가지 갈래로 분기를 만들어 값을 리턴하는 기능을 만드는 것이었다.처음에 dto 설계를 잘 못해서 객체를 객체로 감싸서 List 자체만이 나오는 것이 아니라 dto에서 설정한 이름이 한번 더 포장되어서 결과가 반환되었다. API에서 디버그를 사용하면 요청이 보내졌을 때 변해지는 과정을 알 수 있으면 좋겠다. 아니면 내가 알지 못하는 사용법이 있는 것 같다.8일차 과제 - 미니프로젝트 도입아직은 특별하게 작업물을 만들지는 않았다. 5월 23일까지 제출해야하는 것이므로 프로젝트 전체적으로 크게 보고나서 설계하고 만들어가는 것도 늦지 않다고 생각을 하고, 강의를 들어가면서 구축해나가야 할 것 같다.본격적인 내용은 3주차 회고에서 나오게 될 것 같다.기존 구조에서 새로운 것을 추가하고 JPA를 다양하게 사용해보고 이제 연관관계 매핑이나 백엔드를 살짝 벗어나는 내용도 나오게 될 것 같다. 특히 배포 부분에 관련된 내용 같은데 이 부분은 아는게 많이 없어서 접해보는 걸로 만족하는 계기가 되지 않을까?

백엔드워밍업스터디BE1기회고록

이삭토스트

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

 강의 수강 1일차 - 서버 개발을 위한 기본 환경 설정 및 네트워크 기초 기본적인 내용을 배우는 시간, HTTP 네트워크 기초에 대해서 배우고 있는 내용이 있어서 기본에 배웠던 내용들을 복습하는 시간이 되었다.2일차 - 첫 HTTP API 개발 대표적으로 GET과 POST를 나타내며 데이터를 전달하는 방법이 쿼리와 Body(JSON)으로 나뉘며 자세하게 모르고 있었던 JSON을 받는 방법에 대해서 알게 되었다.예전에 배웠던 부트캠프에서 스프링을 배우다가 dto 개념을 제대로 모르는 상태에서 프로젝트에 투입이 되었는데, request 와 response 을 활용하지 못하여 주어진 소스코드를 이해하지 못해서 구조를 어떻게 활용을 해야하나 고민했었다.그리고 다양한 파라미터와 JSON을 받아서 어떻게 컨트롤러 단에서 처리를 해야하는지 전혀 감이 잡히지 않았는데 최태현 코치님이 보여주신 구체적인 예를 통해서 막연한 안개가 걷힌 느낌이 들었다.  3일차 - 기본적인 데이터베이스 사용법 MySQL에 대해서 이론적인 부분은 배운 상태이지만 우리가 실무적인 면에서 주로 사용하는 명령어들을 통해서 MySQL을 어떻게 사용해야 할지 감을 잡게 되었다.JPA를 이론적으로는 알고 있는 상황이지만 실질적인 프로젝트에 적용해본 상태는 아니다. JPA를 JdbcTemplate대신에 사용한다는 것을 알지만, 어떤 범위에 사용하는지를 몰랐고 그 기본적인 사용법을 알고나서 이후에 있는 JPA를 어떻게 적용할지 조금 두근거리긴한다.무엇보다 백엔드는 어떤 역할을 하는지(기능, 로직, DB...) 구체적으로 체험 할 수 있게 되었다.4일차 - 데이터베이스를 만드는 API 구체적으로 jdbcTemplate를 사용하는 구간이 아닌가 싶다. DB를 사용하면서, 데이터 자체가 유효한 값을 가지는지, 정당한 요청이 오지 않아 오류를 던져준다던지(예외 처리) 확인하는 구간이다.5일차 - 클린코드의 개념과 첫 리팩토링 클린코드에 대해서 많이 들었던 기억이 있다. 이론적으로만 들었기에 어떻게 적용할지 몰랐는데, Controller에 너무 많은 역할이 존재하므로 Controller - HTTP 관련 역할 담당 , Service - 분기처리, 로직 담당, Repository - DB와 접근을 담당으로 나눈 방법을 통해서 클린코드를 구체적인 방법으로 체험하는 시간이었다. 미션1일차 - 자바 어노테이션 스프링에서 현업에 사용하시는 분들의 필요에 의해서 이미 여러개의 어노테이션이 정립이 되어있는 것으로 기억한다. 하지만 그게 어떤 원리로 작성이 되었는지는 모르고 있다. 특히 원초적인 자바 어노테이션은 더더욱 알일이 없다. 일반적인 어노테이션은 눈에 익을 만큼 자주 보이지만, 일반적인 어노테이션에서 벗어나는 특별한 어노테이션이 필요할 때는 커스텀 어노테이션을 작성한다는 것을 알게 되었다. 특히 커스텀 어노테이션을 만들어 반복작업을 줄이는 노력을 할 수 있다는 것이다.다양한 답변들을 알아보기 위해서 네이버, 구글, ChatGPT를 사용하여 여러 방면으로 데이터를 얻고자 했고, 이론적인 부분만 존재하는 것보다는 최대한 개발자에게 있어 최고의 문서인 코드를 통해서 나타내는 예시들을 골라서 정리했다.2일차 - 추가적인 API 개발 쿼리 파라미터를 받아서 JSON으로 반환하는 방법을 배우고, LocalDate를 이용하여 날짜를 받아서 getDayOfWeek()을 이용하여 날짜를 나타내는 방법을 배웠다.마지막으로는 쿼리 파라미터가 아니라 JSON 바디로 받으면서 또 List를 가지고 있는 JSON을 이용하여 API를 만드는 방법에 대해서도 배우게 되었다. 힌트로 알려 주신게 컸지만 DTO에서 List를 받아 iter로 반복하여 API가 기능하게끔 반환 할 수 있다. POST MAN의 API 테스트 툴이 정말 절실하다는 것을 느끼게 되었다.3일차 - 익명 클래스와 람다식 람다식은 함수형 프로그래밍 개념을 자바에 도입하기 위해서, 코드를 더 간결하고, 읽게 쉽게 만들고, 성능이 중요시 되는 최근 병렬 처리와 이벤트 기반 프로그래밍으로 효율적으로 대응 할 수 있다.람다식과 익명 클래스의 관계는람다식은 익명 함수를 간결하게 표기, 익명 클래스는 이름이 없는 클래스 = 주로 인터페이스 구현체 생성에 사용한다.그러므로 람다식은 익명 클래스를 대체, 코드가 더 간결해지고 가독성이 향상 된다.함수형 프로그래밍, 익명클래스, 람다식, 함수형 인터페이스, 스트림 API, 메소드 레퍼런스등 저 2개의 질문에 대해서 많은 양의 검색과 정리를 통해서 답을 도출해낼 수 있었다. 도입배경과 적용 방법 등이 있지만 무엇보다 많은 숙련도를 요구하는 방법이다보니 쉽게 접근하지 못하지만 분명 열심히 단련하면 좋은 접근 방식인 것 같다. 4일차 - 추가적인 API 개발기존 API 개발에서 발전하여 JdbcTemplate를 적용하여 API를 작성하는 과제였다.다만 단순하게 API를 작성한다면 각각의 요구에 맞게 작성을 해나가면 되겠지만, 이번 과제는 모든 요구사항을 확인하여 테이블을 작성하고나서 문제를 해결해나가는 것이 도움이 되었던 것 같다. 마치 Q&A에서 기획 -> 논의 -> 개발 단계처럼 먼저 기획을 통해서 기능을 적고, 이후 API 명세서를 만들고 DB 스키마를 만들고나서, 개발 단계로 들어가 직접 코드를 타이핑 하는 과정 처럼 말이다. 5일차 - 클린 코드과제로 주어진 코드를 코딩테스트를 준비하던 과정에서 겪었던 것 처럼, 입력을 받고 기본적인 설정을 하는 구간 / 주사위를 굴리고 카운트 하는 클래스 / 주사위가 나온 횟수를 출력하는 클래스 등으로 나눠서 명확하게 나누어 읽기 쉬운 코드를 만드는게 클린 코드를 만드는 방법일 것 같다.사실 이런 과정이 어렵지는 않았는데 코딩테스트 스터디를 준비하면서 여러 언어가 모이게 되고소통의 어려움이 있었다. 좀 더 구성을 깔끔하게 나누어 클래스로 구성하고 주석을 통해서 어떤 기능을 하는지 알려주어 소통의 어려움을 해결 했던 경험이 한 몫을 했던 것 같다.  

백엔드워밍업스터디BE1기회고록

채널톡 아이콘