블로그
전체 32024. 05. 19.
0
[인프런 워밍업 클럽 스터디 1기] 세번째 발자국
1. 3주차 학습한 내용 [10일차 - 객체지향과 JPA 연관관계]1. JPA 연관관계에 대한 추가적인 기능들1:1 관계 - @OneToOne예) 한 사람은 한 개의 실거주 주소만을 갖고 있다.@OneToOne 어노테이션을 사용한다.연관관계 주인이 아닌 쪽에 mappedBy 옵션을 사용한다.연관관계의 주인 효과객체가 연결 기준이 된다.상대 테이블을 참조하고 있으면 연관관계의 주인이다.연관관계 주인이 아니면 mappedBy를 사용한다.연관관계의 주인의 setter가 사용되어야만 테이블을 연결한다.연관관계의 사용 시 주의해야 할 점트랜잭션이 끝나지 않았을 때, 한 쪽만 연결해두면 반대 쪽은 알 수 없다. > setter 한번에 둘이 같이 이어주면 된다.N:1 관계 - @ManyToOne과 @OneToMany@ManyToOne을 단방향으로만 사용할 수도 있다.cascade 옵션 : 한 객체가 저장되거나 삭제될 때, 연결되어 있는 객체도 함께 저장되거나 삭제되는 옵션이다.orphanRemoval 옵션 : 객체간의 관계가 끊어진 데이터를 자동으로 삭제하는 옵션이다.실제 DB에서 데이터를 삭제하고 싶을 때 사용한다.@JoinColumn연관관계의 주인이 활용할 수 있는 어노테이션을 의미한다.필드의 이름, null여부, 유일성 여부, 업데이트 여부 등을 지정한다.N:M 관계 - @ManyToMany구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 권장한다.도메인 계층에 비즈니스 로직이 들어갔다?BookService는 UserLoanHistory 객체를 직접 사용하지 않도록 변경하였다.User와 UserLoanHistory, 2개의 객체가 서로 협력하도록 변경하였다. 이를 도메인 계층에 비즈니스 로직이 들어갔다라고 표현한다.2. 영속성 컨텍스트의 4번째 특징지연 로딩(Lazy Loading) : 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다.@OneToMAny의 fetch 옵션이다.(기본적으로 Lazy로 설정되어 있다.)연관관계를 사용하면 무엇이 좋을까?각자의 역할에 집중하게 된다. (=응집성)새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.테스트 코드 작성이 쉬워진다.연관관계를 사용하는 것이 항상 좋을까?지나치게 사용하면 성능 상의 문제가 생길 수도 있고, 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.비즈니스 요구사항, 기술적인 요구사항, 도메인 아키텍쳐 등 여러 부분을 고민해서 연관관계 사용을 선택해야 한다.[11일차 - 기본적인 배포를 위한 준비]1. 배포란?최종 사용자에게 SW를 전달하는 과정을 의미한다.전용 컴퓨터(AWS)에 우리의 서버를 옮겨 실행시키는 것이다.최종 사용자가 우리의 서버를 쓸 수 있는 방법전용 컴퓨터에 코드를 옮기고 스프링, MYSQL 등을 설치해 사용자가 접속하게 한다.AWS에서 컴퓨터를 빌릴 때 알아둬야 할 점컴퓨터를 살 때 운영체제도 같이 선택한다.윈도우, 리눅스, 맥OS2. profile과 H2 DBprofile 적용스프링 서버를 실행할 때 db와 같은 설정들을 코드 변경 없이 제어할 수 있는 방법spring: config: activate: on-profile: local datasource: url: "jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER" username: "sa" password: "" driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.H2Dialect h2: console: enabled: true path: /h2-console --- spring: config: activate: on-profile: dev datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 3. git과 githubgit이란?코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램을 의미한다.버전 A, 버전 B를 쉽게 만들 수 있게 해주고 여러 버전을 쉽게 취합이 가능하다.github이란?git으로 관리되는 프로젝트의 코드가 저장되는 원격 저장소를 의미한다.왜 github에 코드를 저장하는걸까?컴퓨터의 있는 소스코드가 소실될 수 있기 때문에 코드를 원격의 저장하는 것이다.배포할 때도 활용한다.4. git 기초 사용법git을 활용해서 github 프로젝트 업로드하기github 사이트 접속github 저장소 생성한다.(Create Repository)IntelliJ Terminal을 이용해 git 명령어 입력git 프로젝트 시작하기 / git init : 이 프로젝트를 이제 git이 관리하겠다는 의미git 프로젝트의 github 저장소 설정하기 / git remote add origin [각자의 주소]기초 셋팅 완료git 기초 명령어코드를 git에 추가할 때 명령어git add.git에 메세지 붙이는 명령어git commit-m "메세지"git을 github에 보내기git push현재 상황 확인하기git status파일들 빼주기git reset5. AWS의 EC2 사용하기회원가입AWS 계정 생성(회원가입) - 회원정보/결제정보/본인인증/Support 플랜 (무료) 선택로그인루트 사용자 선택 - 계정입력 후 로그인콘솔 홈지역(서버) 서울로 설정서비스에서 EC2 검색 및 클릭 - 리소스 : 인스턴스(빌린 컴퓨터) 클릭인스턴스 시작 클릭 - 이름 및 태그 : 이름 입력 - 아마존 리눅스 선택 - 인스턴스 유형(빌린 컴퓨터의 사양) CPU 및 메모리 t2.micro 선택 - 키 페어 : 새 키 페어 생성 - 키 페어 이름 입력 수 생성 - 네트워크 설정 : 보안 그룹 생성 선택 - 스토리지 구성(용량) 8gib - 설정 후 인스턴스 시작 클릭인스턴스 목록을 보면 실행 중인 서버가 확인된다. [12일차 - AWS와 EC2 배포]1. EC2에 접속해 리눅스 명령어 다뤄보기다운로드 받은 키 페어를 이용하는 방법우리가 접속하려는 EC2의 IP 주소 : 퍼블릭 IPv4 주소이전 시간에 다운로드 받았던 키 페어접속하기 위한 프로그램(git CLI 또는 Mac treminal)기본적인 리눅스 명령어mkdir : 폴더를 만드는 명령어ls : 현재 위치에서 폴더 또는 파일을 확인하는 명령어cd : 폴더 안으로 들어가는 명령어pwd : 현재 위치를 확인하는 명령어2. 과제여섯 번째 과제(6일차)일곱 번째 과제(7일차)3. 회고프로젝트 배포 하는 법을 알 수 있어서 좋았고, 배포를 하면서 오류가 발생해서 한번에 되지 않아 시간이 오래 걸렸다. 리눅스에 대한 공부도 해야겠다는 생각이 들었다. 아직 미니 프로젝트를 진행하진 못했지만 배운 것을 활용해서 잘 마무리해야겠다!
백엔드
・
워밍업
・
발자국
・
회고
・
3주차
2024. 05. 12.
0
[인프런 워밍업 클럽 스터디 1기] 두번째 발자국
1. 2주차 학습한 내용 [6일차 - 스프링 컨테이너의 의미와 사용 방법]1. UserController와 스프링 컨테이너스프링 빈이란?서버가 시작되면, 스프링 서버 내부에 컨테이너를 생성한다.컨테이너 안에 클래스가 들어간다.이때 다양한 정보도 들어있고, 인스턴스화도 이루어진다.들어간 클래스를 스프링 빈이라고 한다.JdbcTemplate 의존성 주입이 되어있다.JdbcTemplate을 스프링 빈으로 등록해주는 설정 코드가 있다.dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } 서버 시작 시스프링 컨테이너 시작 -> 기본적으로 많은 스프링 빈 등록 -> 우리가 설정한 스프링 빈(UserController) 등록 -> 의존성 자동으로 설정스프링 빈으로 등록각 클래스가 JdbcTemplate을 가져오기 위해 스프링 빈으로 등록한다.어노테이션 추가한다.2. 스프링 컨테이너를 왜 사용할까?Interface 활용BookController는 BookService을 사용한다.BookService는 BookRepository 인터페이스 사용한다.또 다른 Repository(Repository1, Repository2)가 있다. BookService 코드를 변경하지 않고 BookRepository을 변경할 수 있는 방법이 스프링 컨테이너이다.스프링 컨테이너 사용시컨테이너가 Repository1 또는 Repository2 중 하나를 선택한 후 BookService를 생성해준다. 이러한 방식을 제어의 역전(IoC, Inversion of Control)이라고 한다.컨테이너가 BookService를 생성할 때, Repository1와 Repository2 중 하나를 선택해서 넣어준다. 이러한 과정을 의존성 주입(DI, Dependency Injection)이라도 한다.우선권을 부여하는 어노테이션 활용@Primary : 우선권을 결정하는 어노테이션을 의미한다.@Primary 어노테이션을 사용 시 Service 코드 변경없이 해당 Repository를 사용할 수 있다.3. 스프링 컨테이너를 다루는 방법빈을 등록하는 방법@Configuration클래스에 붙이는 어노테이션이다.@Bean을 사용할 때 함께 사용해야 한다.@Bean메서드에 붙이는 어노테이션이다.메서드에서 반환하는 객체를 스프링 빈에 등록한다.@Configuration과 @Bean 사용하는 경우외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Component주어진 클래스를 컴포넌트로 간주한다.이 클래스들은 스프링 서버를 시작할때 자동으로 감지된다.언제 @Component가 사용될까?Controller, Service, Repository가 아닌 추가적인 클래스를 스프링 빈으로 등록할 때 종종 사용된다.스프링 빈 주입 받는 방법생성자 사용(@Autowired 생략 가능) -> 가장 권장한다.@Setter와 @Autowired 사용 -> 누군가 Setter를 사용하면 오작동할 수 있다.필드에 직접 @Autowired 사용 -> 테스트를 어렵게 만드는 요인이다.@Qualifer("value") 사용여러가지 후보군이 있을 때 특정 하나를 가져오고 싶을때 사용한다.스프링 빈을 사용하는 쪽과 스프링 빈을 등록하는 쪽 모두 사용할 수 있다.적어준 값이 동일한 것끼리 연결된다.@Primary와 @Qualifer 함께 사용할 경우우선권을 결정해주는 @Primary와 @Qualifer을 함께 사용했을 때 누가 사용될까?@Qualifer을 사용한다.> 스프링 빈을 사용하는 쪽에서 특정 빈을 지정해준 것의 우선순위를 더 높게 간주한다. [7일차 - Spring Data JPA를 사용한 데이터베이스 조작]1. 문자열 SQL을 직접 사용하면 좋지 않은 이유문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다. 컴파일 시점에 발견되지 않고 런타임 시점에 발견된다.특정 데이터베이스에 종속적이게 된다. DB의 종류마다 문법이 조금씩 다르다.반복 작업이 많아진다. 테이블 하나 만들 때마다 CRUD 쿼리가 항상 필요하다.데이터베이스의 테이블과 객체는 패러다임이 다르다.2. JPA(Java persistence API)JPA란?자바 진영의 ORM(Object-Relational Mapping) 기술 표준을 의미한다.객체와 관계형 DB의 테이블을 매핑하여 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙을 의미한다.Hibernate규칙을 구현한 구현체를 Hibernate(하이버네이트)라고 한다.Hibernate는 내부적으로 JDBC를 사용한다.3. 유저 테이블에 대응되는 Entity Class 만들기 - Java 객체와 MySQL Table 매핑하기JPA 어노테이션@Entity : 저장되고, 관리되어야 하는 데이터를 의미한다.@Id : 해당 필드를 primary key로 간주한다.@GeneratedValue : primary key는 자동 생성되는 값이다.@Column(생략 가능) : 객체의 필드와 Table의 필드를 매핑한다.기본 생성자 추가기본 생성자도 추가해야 한다.@Entity public class User { protected User() { } } application.yml - JPA 설정 옵션 추가spring: jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 4. Spring Data JPA 사용 - 자동으로 쿼리 전송하기SQL을 작성하지 않고 유저 생성/조회/업데이트 기능 리팩토링하기유저 생성 기능 리팩토링하기Interface UserRepository인터페이스 UserRepository 생성 후 JpaRepository를 상속 받는다.UserServicesave() 메서드에 객체를 삽입하면 Insert SQL이 자동으로 전송된다.저장이 된 후 User에는 id가 들어간다. 유저 조회 기능 리팩토링하기UserResponse 생성자 추가코드를 더 깔끔하게 만들기 위해 생성자를 추가한다.UserServicefindAll 메서드를 사용하면 모두 유저의 데이터를 조회하는 SQL이 전송된다.그 결과, List가 반환되고, UserResponse로 변경해서 전달한다.유저 수정 기능 리팩토링하기UserfindById를 사용하면 id를 기준으로 1개의 데이터를 가져온다.Optional의 orElseThrow를 사용해 User가 없을 경우 예외처리한다.객체를 수정해주고, save 메서드를 호출한다.자동으로 UPDATE SQL이 전송된다.SQL을 작성하지 않아도 동작 하는 이유Spring Data JPA를 통해 SQL을 작성하지 않아도 동작한다.Spring Data JPA : 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리이다.5. Spring Data JPA 사용 - 다양한 쿼리 작성하기By 앞에 들어갈 수 있는 구절 정리find : 데이터 1건을 가져온다. 반환 타입은 객체, Optional이다.findAll : 쿼리의 결과물이 N개인 경우 사용한다. List을 반환한다.exists : 쿼리 결과가 존재하는지 확인한다. 반환 타입은 boolean이다.count : SQL의 결과 개수를 센다. 반환 타입은 long이다.각 구절은 and 또는 or로 조합할 수 있다.By 뒤에 들어갈 수 있는 구절 정리GreaterThan : 초과GreaterThanEqual : 이상LessThan : 미만LessThanEqual : 이하Between : 사이에StartsWith : ~로 시작하는EndsWith : ~로 끝나는 [8일차 - 트랜잭션과 영속성 컨텍스트]1. 트랜잭션(Transaction)트랜잭션이란?쪼갤 수 없는 업무의 최소 단위를 의미한다. (모두 성공하거나 실패하는 경우)트랜잭션 동작 명령어트랜잭션 시작하기 : start transaction;트랜잭션 정상 종료하기 (SQL 반영) : commit;트랜잭션 실패 처리하기 (SQL 미반영) : rollback;2. 트랜잭션 적용과 영속성 컨텍스트트랜잭션 적용하기@Transactional 어노테이션을 사용한다.@Service public class UserServiceV2 { //조회 - readOnly 옵션 사용 가능(SELECT 쿼리) @Transactional(readOnly = true) public List getUsers() { return userRepository.findAll().stream().map(UserResponse::new).collect(Collectors.toList()); } } 메서드가 시작될때 Transactional 시작된다.메서드 로직이 정상적으로 성공하면 commit되고, 문제가 생길 경우 rollback된다.트랜잭션을 사용 하는 이유트랜잭션이 없으면 코드가 한줄 한줄 반영된다.오류가 생겨도 다른 코드는 반영된다.주의사항org.springframework.transaction.annotation.Transactional을 붙여야 한다.IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.영속성 컨텍스트이란?테이블과 매핑된 Entity 객체를 관리 및 보관하는 역할을 의미한다.트랜잭션과 영속성 컨텍스트의 관계트랜잭션 사용 -> 영속성 컨텍스트 시작트랜잭션 종료 -> 영속성 컨텍스트 종료영속성 컨텍스트의 특징변경 감지(Dirty Check) : 영속성 컨텍스트 안에서 확인된 Entity는 명시적으로 save하지 않아도 변경을 감지해서 자동으로 저장한다.쓰기 지연 : DB의 INSERT/UPDATE/DELETE SQL을 바로 전송하지 않고, 트랜잭션이 commit될 때 SQL을 모아서 한번만 전송한다.1차 캐싱 : ID를 기준으로 Entity를 기억한다. 최초 1회만 쿼리가 전송되고, 나머지는 보관하고 있는 데이터를 활용한다. 이렇게 반환된 객체는 동일하다. [9일차 - 조금 더 복잡한 기능을 API로 구성하기]1. 책 생성/대출/반납 기능 API 개발하기book 테이블 및 객체 생성, DTO, Repository, Service, Controller 구현대출 기록에 대한 Table 추가, 대출 기록 Table에 대한 객체 생성, DTO, Repository, Service, Controller 구현생성한 테이블로 구현이 충분하지만, DTO를 새로 만드는 게 낫다.다른 기능들 중 한 기능에 변화가 생길 경우 더 유연하게 side-effect가 없이 대처가 가능하기 때문이다.2. 미션네 번째 과제(4일차)다섯 번째 과제(5일차)3. 회고1주차보다 학습한 내용이 많아진 만큼 정리를 잘하고 공부를 많이 해야겠다고 느꼈다. 금요일에 해주신 특강도 너무 도움이 되었다. 내용이 나한테는 아직 어려웠지만 다른 사람들의 코드를 보면서 나도 좀 더 고민해보고 코드를 짜고 과제도 해봐야겠다.
백엔드
・
발자국
・
회고
・
워밍업
・
2주차
2024. 05. 05.
0
[인프런 워밍업 클럽 스터디 1기] 첫번째 발자국
1. 1주차 학습한 강의 내용 1일차(1강~5강)1. 새로운 프로젝트 시작하기Spring Initializr 사용하기https://start.spring.io/새로운 프로젝트를 시작할 때 사용하면 된다.의존성 : 프로젝트에서 사용하는 라이브러리와 프레임워크를 의미한다.라이브러리 : 프로그래밍을 개발할 때 미리 만들어져 있는 기능들을 가져와서 사용하는 것을 의미한다.프레임워크 : 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져와서 넣는 것을 의미한다.2. @SpringBootApplication과 서버@SpringBootApplicationpackage com.group.libraryapp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class LibraryAppApplication { public static void main(String[] args) { SpringApplication.run(LibraryAppApplication.class, args); } }@SpringBootApplication : 어노테이션, 스프링 부트를 자동으로 설정이 가능하다.Class : 메인 메소드로 구성된다.SpringApplication.run(LibraryAppApplication.class, args) : 실제 스프링 부트 애플리케이션을 시작한다는 의미를 가진 코드이다.서버(Server)란?기능을 제공하는 것을 의미한다.어떠한 기능을 제공하는 프로그램을 의미한다.그 프로그램을 실행시키고 있는 컴퓨터를 의미한다.3. 네트워크란 무엇인가?IP : 컴퓨터의 주소를 의미한다.Domain Name(도메인 네임) : 외우기 어려운 IP 대신 외우기 쉬운 이름으로 변환한 것을 의미한다.DNS : IP 244.66.51.9 = 도메인 네임 spring.com, 이러한 체계를 의미한다.port(포트) : 사용하는 프로그램 데이터를 받는다.4. HTTP와 API란 무엇인가?HTTP란?인터넷에서 데이터를 주고 받을 때 하는 표준, 약속을 의미한다.예) 운송장 표준 - 요청하는 행위, 받는 사람, 항목(자원), 세부조건행위와 자원은 운송장을 보내기 전에 약속을 해야 한다.HTTP 요청GET 요청GET /portion?color=red&count=2 Host: spring.com:3000 //의미 - 내놓아라 파란집 둘째, 포션 빨간색 2개 GET(HTTP Method) : 요청을 받는 컴퓨터에게 요청하는 행위(데이터 요청)/portion(Path) : 받을 항목(자원)? : 구분기호color=red : 자원의 세부조건(Query)& : 구분기호count=2 : 자원의 세부조건(Query)Host: spring.com:3000 : HTTP 요청을 받는 컴퓨터와 프로그램 정보POST 요청POST/oak/leather Host: spring.com:3000 오크가죽정보 //창고에 넣어라 빨간집, 오크가죽 POST : 요청을 받는 컴퓨터에게 요청하는 행위(데이터 저장)/oak/leather : HTTP 요청을 받는 컴퓨터에게 원하는 자원Host: spring.com:3000 : 어떤 컴퓨터에 어떤 데이터를 받을지 정보오크가죽정보 : 실제 저장할 오크 가죽 정보(데이터, Body)데이터를 보내는 2가지의 방법쿼리 : GET에서 사용한다.바디 : POST에서 사용한다.다양한 HTTP MethodGET : 데이터 요청, 쿼리 사용POST : 데이터 저장, 바디 사용PUT : 데이터 수정, 바디 사용DELETE : 데이터 삭제, 쿼리 사용API(Application Programming Inteface)란?정해진 약속을 통해 특정 기능을 수행하는 것을 의미한다.HTTP 응답정보 처리해서 응답 보내기(200 OK) -> 200 OK : 정보가 잘 저장되었다는 의미이다.저장이라는 기능을 수행한다.💡 요청에 대한 응답을 제공한 컴퓨터는 서버(Server)를 의미한다.💡요청한 컴퓨터는 클라이언트(Client)를 의미한다.상대 코드응답에 들어가는 숫자를 의미하며, 매우 다양하다.어떠한 상태인지 알려주는 코드이다.상대 코드의 종류200 OK : 요청이 성공했다는 의미이다.300 Moved Permanently : 다른 곳으로 옮겨가라는 의미이다.404 NotFound : 요청한 내용을 찾을 수 없다라는 의미이다.500 Internal Server Error : 내부에 문제가 발생했다는 의미이다.5. GET API 개발하고 테스트 하기덧셈 APIHTTP Method -> GETHTTP Path -> /add쿼리(key와 value) -> int number1 / int number2API의 반환 결과 -> 숫자 - 두 숫자의 덧셈 결과GET API 개발 데이터의 흐름Postman에서 ?number1=100&number2=200(쿼리) 스프링 부트에서 보내면 값을 보고 객체로 만들어둔 Calculator, Add, Request에다가 값을 넣는다.그 객체를 Controller, API의 진입지점에 보내준다.정보를 전달하는 역할의 객체 : DTO(Data Transfer Object)Postman에서 send를 하면, HTTP 요청 -> 스프링 부트 서버로 도착 -> API 진입지점을 거쳐 /Add 통과 후 DTO request 함수를 실행한다.return -> 응답 생성 -> Postman에게 전달 -> Postman에서 결과를 보여준다. 2일차(6강~9강)1. POST API 개발 및 테스트하기POST API에서 데이터 받을 경우HTTP Body 사용한다.JSON으로 데이터를 받는다.사용되는 문법 -> JSONJSON이란?객체 표기법을 의미하며, 무언가를 표현하기 위한 형식이다.JSON 문법{}중괄호를 사용한다.{}중괄호 안에 "key":value로 표기한다.속성은 ,로 구분한다.추가적으로 다른 JSON 문법을 작성할 수 있다.{ "name":"김철수", "age":50 } 곱셈 APIHTTP Method -> POSTHTTP Path -> /multiplyHTTP Body(JSON) -> {"number1":숫자,"number2":숫자}API의 반환 결과 -> 숫자(곱셈 결과)POST API 개발 데이터 흐름데이터를 전달해주는 객체인 DTO 생성POST API 개발Body 사용 시 @RequestBody 어노테이션을 사용한다.JSON을 CalculatorMultiplyRequest 객체로 전환해준다. 2. 유저 생성 API 개발 및 테스트하기도서 관리 애플리케이션의 요구사항사용자도서관 사용자 등록(이름 필수, 나이 선택)도서관 사용자 목록 확인도서관 사용자 이름 수정도서관 사용자 삭제책도서관 책 등록 및 삭제도서관 사용자 책 대여다른 사람이 대여 시 대여 불가능도서관 사용자 책 반납도서관 사용자 등록하기유저 생성 API 조건HTTP Method : POSTHTTP Path : /userHTTP Body (JSON)JSON { "name": String (null 불가능), "age":Integer } 결과 반환 X(HTTP 상태 200 OK이면 충분하다.)유저 생성 API 개발 데이터 흐름Body를 객체로 표현할 DTO 생성유저를 저장하기 위한 객체 생성유저 생성 API 개발POST user 호출 -> 함수 실행 -> Body에 이름과 나이가 들어오면 객체로 매핑한다.새로운 유저를 만들 때 사용되는 Requset -> 생성된 유저 객체가 List에 저장 -> 함수가 예외없이 완료되면 응답코드 200 OK로 반환한다.3. 유저 조회 API 개발 및 테스트하기유저 조회 API 조건HTTP Method : GETHTTP Path : /user쿼리 : 없음결과 반환 (JSON)JSON { "name": String (null 불가능), "age":Integer } 유저 조회 API 개발 데이터 흐름데이터를 담아 줄 DTO 생성유저 조회 API 개발User List 생성 -> List에 들어있는 유저들이 1개씩 돌면서 UserResponse 형태로 반환한다.결과 리스트에 추가 -> responses로 반환한다. 3일차(10강~13강)1. 컴퓨터의 핵심 부품 이해하기서버 유저 정보가 왜 남아있지 않는지 이해하기 위해 알아보자.CPU : 연산RAM : 임시 기억장치DISK : 장기 기억장치2. Database와 MYSQLDatabase란?데이터를 구조화시켜 저장하는 것을 의미한다.RDB (Relational Database) - MySQL : 데이터를 표처럼 구조회 시켜 저장하는 것을 의미한다.SQL(Structured Query Language) : 표처럼 구조화된 데이터를 조회하는 언어이다.3. MySQL에서 Table 생성하기데이터베이스 생성create database [데이터베이스 이름]; 데이터베이스 목록 확인show databases; 데이터베이스 삭제drop database [데이터베이스 이름]; 데이터베이스 안으로 들어가기use [데이터베이스 이름]; 테이블 목록 확인show tables; 테이블 생성create table [테이블 이름] ( [필드1 이름] [타입] [부가조건], [필드1 이름] [타입] [부가조건], ... primary key([필드 이름]) ); 테이블 생성 예시create table fruit ( id bigint auto_increment, name varchar(20), price int, stocked_date date, primary key (id) ); auto_increment : 데이터가 없어도 1부터 1개씩 증가하며, 자동 기록된다.primary key : 유일한 키를 의미하며, id라는 필드를 지정한다.테이블 삭제drop table [테이블 이름]; => 해당 SQL를 DDL(Data Definition Language)이라고 정의한다.MYSQL 타입의 종류정수 타입tinyint : 1바이트int : 4바이트bigint : 8바이트실수 타입double : 8바이트 정수decimal(A, B) : 소수점을 B개 갖고 있는 전체 A자릿수 실수문자열 타입char() : ()글자가 들어갈 수 있는 문자열varchar() : 최대 ()글자가 들어갈 수 있는 문자열날짜, 시간 타입date : 날짜, yyyy-MM-ddtime : 시간, HH:mm:ssdatetime : 날짜와 시간을 합친 타입, yyyy-MM-dd HH:mm:ss4. Table 데이터 조작하기생성, 조회, 수정, 삭제 방법(CRUD)생성 : Create읽기 : Read수정 : Update삭제 : Delete데이터 삽입insert into [테이블 이름](필드1 이름, 필드2 이름) values (값1, 값2, ...) 데이터 삽입 예시insert into fruit (name, price, stocked_date) values ('사과', 1000, '2023-01-01'); ()안의 필드와 값의 순서가 중요하기 때문에 순서대로 작성해야 한다.id는 지정하지 않아도 auto_increment가 자동으로 생성해준다.데이터 조회select * from [테이블 이름]; select * from [테이블 이름] where [조건]; 데이터 조회 예시select name, price from fruit; select * from fruit where name = '사과' and price 테이블명 대신 필드 이름도 가능하며, 여러개를 넣을 수도 있다.조건을 넣어서 조회도 가능하다. (and, or, =,>=,데이터 수정update [테이블 이름] set 필드1이름=값, 필드2이름=값, ... where [조건]; 데이터 수정 예시update fruit set price = 1500 where name = '사과'; 조건을 붙이지 않으면 모든 데이터가 업데이트 되기 때문에 주의 해야 한다.데이터 삭제delete from [테이블 이름] where [조건]; 데이터 삭제 예시delete from fruit where name = '사과'; 조건을 붙이지 않으면 모든 데이터가 삭제 되기 때문에 주의 해야 한다.=> 해당 SQL를 DML(Data Manipulation Language)이라고 정의한다.5. Spring에서 Database 사용하기Database 설정 파일 추가application.yml 파일 생성spring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://Host/접근DB명username: MySQL에 접근하기 위한 계정명password: MySQL에 접근하기 위한 비밀번호driver-class-name: DB에 접근 시 사용할 프로그램 4일차(14강~16강)1. 사용자 수정 API, 삭제 API 개발 및 테스트하기사용자 수정 API 조건HTTP Method : PUTHTTP Path : /userHTTP Body (JSON){ "id": Long, "name": String } 결과 반환 X (HTTP 상태 200 OK이면 충분하다.)사용자 삭제 API 조건HTTP Method : DELETEHTTP Path : /userQuery 사용문자열 name (삭제되어야 하는 사용자 이름)결과 반환 X (HTTP 상태 200 OK이면 충분하다.)사용자 수정 및 삭제 API 개발사용자를 수정하기 위한 DTO 추가사용자 수정/삭제 API 개발사용자 수정 API, 삭제 API 예외처리 하기존재하지 않는 사용자를 수정하거나 삭제하려고 해도 응답코드 200 OK가 나온다.> 예외처리해야 한다.데이터 존재 여부를 확인하고 예외처리 하기사용자 수정/삭제 API 예외처리 개발id를 기준으로 사용자가 존재하는지 확인하기 위해 SELECT 쿼리 작성한다.SQL을 DB에 전송해서 데이터가 있는지 확인한다.SELECT SQL의 결과가 있으면 0 반환, ? 값 id를 삽입한다.0은 최종적으로 List로 반환한다. 사용자가 존재하지 않을 경우 예외처리한다.사용자가 존재하지 않을 경우예외처리한 결과, 내부에 문제가 있다는 오류가 발생했다. 5일차(17강~18강)1. 좋은 코드(Clean Code)가 왜 중요한가?코드는 요구사항을 표현하는 언어이다. 좋은 코드는 코드만 보고도 의미를 파악을 할 수 있다.안 좋은 코드가 쌓이면, 시간이 지날수록 생산성이 낮아진다.Clean Code함수는 최대한 작게 만들고, 1가지 일만 수행하는 것이 좋다.클래스는 작아야 하며, 하나의 책임만을 가져야 한다.2. Controller, Service, Repository 분리하기Controller의 함수 1개가 하고 있던 역할API의 진입 지점으로서 HTTP Body를 객체로 변환한다 -> Controller현재 유저가 있는지 없는지 등을 확인하고 예외처리를 해준다. -> ServiceSQL을 사용해 실제 DB와의 통신을 담당한다. -> Repository역할 분리 구조Controller : API와 HTTP 관련 역할 담당Service : 분기 처리 및 로직 담당Repository : DB와의 접근을 담당각 역할을 분리하여 수행하는 계층으로 이루어진 구조를 계층화 아키텍쳐(Layered Architecture)라고 한다.JdbcTemplate 변수를 선언하고 생성자를 통해 UserRepository를 인스턴스화하는 시점에 JdbcTemplate을 넣어주도록 변경한다.2. 미션첫 번째 과제(1일차)나만의 어노테이션을 만들 수 있었다는 걸 알게 되었고, 어떠한 상황에서 정해진 어노테이션만 사용했었는데, 만드는 방법을 알게 되어 좋았다.두 번째 과제(2일차)3번째 문제에서 배열로 처리했는데, 배열보다는 리스트로 하는 게 더 좋다는 피드백 댓글을 보고 리스트로 적용해서 구현해보고, 다른 방법들도 알게 되어 좋았다.세 번째 과제(3일차)람다식에 대해 깊게 공부한 적은 없었는데, 이번 과제를 하면서 람다식에 대한 도입 배경, 방법 등을 알게 되어 좋았다.3. 회고일주일이 정말 금방 지나간 느낌이다. 과제를 하면서 스스로 고민해보고 구현하면서 성장할 수 있는 시간을 갖게 되어 좋았다. 다른 일도 겹치면서 아직 4,5일차 과제를 완료하지 못했지만 기간 안에 제출하도록 노력해야겠다. 헷갈리는 부분들을 복습하면서 다음주엔 더 분발해야겠다!
백엔드
・
발자국
・
회고
・
워밍업
・
1주차