블로그
전체 32024. 03. 10.
0
[인프런 워밍업 스터디 클럽 0기-BE] 3주차 발자국
9일차JPA를 활용해서 도서관련 기능들을 더욱 만들어봤습니다.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/inhoru/employee-app 14일차 & 진짜 후기이렇게 모든 강의를 마무리하게 되었습니다. 전반적인 백엔드 개발에 필요한 지식들을 얻어갈 수 있어 좋았습니다.저와 같은 경우에는 이전에 JPA에 관련된 강의도 조금 수강을 한터라 배운 내용을 점검하는 방식으로 진행했던 것 같습니다.Spring Boot를 활용하면서 Spring에 대한 정보보다도 다른 데이터베이스, 리눅스 문법, 설정 파일 등 다양한 지식을 얻을 수 있어 좋았습니다.이후에는 현재 배운 내용들과 함께 좀더 동적으로 쿼리를 다룰 수 있는 방법을 통해 개인 프로젝트를 진행하면서 실제 스프링 동작 원리에 대해서도 깊게 파해쳐보는 시간을 가져보려고 합니다.
2024. 03. 03.
0
[인프런 워밍업 스터디 클럽 0기-BE] 2주차 발자국
Day 619 ~ 22강스프링 컨테어니러를 통해 다양한 설정들을 모두 자동으로 해주며, 클래스가 들어갈 때는 빈을 식별할 수 있게 이름 및 타입과 함께 다양한 정보를 저장하며 자동으로 의존성을 주입해준다.빈 등록 방법에는 클래스에 맞는 빈 어노테이션을 붙이고 @Qualifer와 @Primary 사용법을 배웠다.과제과제6 Day 723 ~ 26강지금까지 sql쿼리문을 짜서 하는것은 너무 힘들다. 문자열을 작성하기 때문에 실수를 인지하는 시점도 느리며, 특정 데이터베이스에 종속적이다. 반복 잔업이 많아지며 테이블과 객체 간에 패러다임이 다르다는 문제가 있었다.그래서 나온게 JPA다. 데이터를 영국적으로 보관하기 위해 Java 진영에서 정해진 규칙이다.프로젝트를 함계하면서 사용법을 익혔다. 과제 과제7 Day 8 27 ~ 29강트랜잭션이란 쪼갤 수 없는 업무의 최소 단위 의미이다.쉽게 말하자면 여러 SQL을 사용시 한 번에 성공시키거나 , 하나라도 실패하면 모두 실패하는 기능이다.트랜잭션을 왜 사용하는지 배웠다. 학교나 자격증때 공부했지만 다시 복습하니 왜 트랜잭션이 중요하지 다시 알게된 계기가 되었다.과제과제는 미니프로젝트인데 아직 구현을 하지못했다 이번주에 구현할예정이다. 정리벌써 2주차가 지나갓다.과제도 미니프로젝트 하나만하면 끝나고 많은걸배울수있엇다.spring boot에대해서 더욱자세히 알수있엇고 been 과 jpa사용 등등 새로운 기술들을배우면서재미를 느낄수있는 시간이었다.
2024. 02. 25.
0
[인프런 워밍업 스터디 클럽 0기-BE] 1주차 발자국
Day 11 ~ 5강시작은 스프링 프로젝트를 시작하는 방법을 알려주셨다.스프링부트 버전 선택부터 프로젝트를 설정하는법을 등등 알려주시며,서버 , HTTP , API에대해 공부를 했다. 평소 HTTP와 API가 뭔지자세히는 모르는상태로 사용하기만했는데이번강의를 통해 구동하는 방식을 배웠다. 과제두가지 질문이있엇다.1. 어노테이션을 사용하는 이유 (효과)는 무엇일까?2. 나만의 어노테이션은 어떻게 만들 수 있을까?나는 어노테이션을 사용하기만해봤지 어노테이션이 뭔지? 어떤방식인지 그걸 알지못했엇다.그래서 이번기회에 어노테이션을 공부하여 나만의 어노테이션을 만들어서 학습을 했다.아래는 과제를 풀면서 찾아본 어노테이션 설명들을 정리해둔곳이다. 과제1 Day 2 6 ~ 9강API를 활용하여 유저 조회 API를 개발하여 만들었다.여기서 Post맵핑과 Json을 이용해서 만들었다 하지만 이번강의에서는 문제점이하나있엇는데바로 유저 정보가 메모리에만유지되었기때문에 정보가 저장이되지않는것이다. 이해결방법은 다음날에알수있엇다.과제2일차 과제는 GET API와 POST API를 만드는 과제였다. 첫번째 과제는 어렵지않게 강의해서배웟던 그래도 했더니 문제없이 완성되었는데두번째 과제는 날짜를 포맷할때 시간이걸렸다. 문제내용과똑같이 만들려면 일 만 나와야하는데이방법을 LocalDate 와 dayOfTheWeek 를이용해서 내가원하는대로 나오게 만들었다.마지막 세번째과제는 PostAPI만들기였다. Json에서 List로 보낼때 DTO에 List가 있다면 받을수있다는 힌트를 보고DTO에 List를 선언해서 해결을했다. 과제2 Day 3 10 ~ 13강드디어 데이터베이스를 배웠다.테이블을 만들고법과 값들을 넣고 조회하는 쿼리문을 배웠고, JdbcTemplate를 사용하여 Spring에서 데이터베이스를 사용 하였다.JAVA 람다를 이용해서 더욱 간다하게 만들수있다는 방법도 알게되었다. 그과정은 아래 과제에서 확인이가능하다.과제이번과제는 익명클래스/람다식/ 이라는것에 대해 질문을했다.이번과제는 그 해답을 정리해두었다.과제3 Day 4 14 ~ 16강드디어 데이터베이스를 배웠다.테이블을 만들고법과 값들을 넣고 조회하는 쿼리문을 배웠고, JdbcTemplate를 사용하여 Spring에서 데이터베이스를 사용 하였다.JAVA 람다를 이용해서 더욱 간다하게 만들수있다는 방법도 알게되었다. 그과정은 아래 과제에서 확인이가능하다.과제이번과제는 익명클래스/람다식/ 이라는것에 대해 질문을했다.이번과제는 그 해답을 정리해두었다.과제4 Day05 17 ~ 18강클린 코드의 중요성과 Controller를 Service와 Repository 분리하는 방법에 대해서 학습하였다.클린 코드의 중요성 하다고 생각만 해왔는데 이번 강의를 통해 조금 더 확실하게 느낄 수 있었다. 분리를하면서 코드를 보니 처음과 다르게 확실히 보는 것이 편해졌다.미션주어진 코드를 최대한 클린하게 만드는 과제가 주어졌는데.기능별로 메서드를 분리하여 리펙토링을 진행했다. 과제5 정리강의를 시작한 이후 정말 많은 것들을 얻어 갈 수 있었습니다.기본 지식부터 출발하여 실습과 과제를 통해 단순히 정보를 습득하는 것뿐만 아니라 그것을 활용하는 방법을 배우게 되었고, 이를 통해 좀 더 기억에 남을 수 있었습니다.지난 일주일 동안 매일 시간을 내어 강의를 듣고, 과제를 수행하며, 그 내용을 공유하는 일에 꾸준히 노력한 나 자신에게 자랑스러웠습니다.모르는 부분이 있을 때마다 그냥 넘어가지 않고 계속해서 찾아보는 시간은 정말 소중했습니다.