손예지
@tfntlog8945
수강평 작성수
-
평균평점
-
블로그
전체 2#카테고리
- 백엔드
#태그
- 인프런
- 워밍업
- 클럽
- 스터디
- 발자국
![[인프런 워밍업 클럽 스터디 1기] BE 2주차 <두 번째 회고록>](https://cdn.inflearn.com/public/files/blogs/e3f2c45d-eda4-47ce-93f8-f03eb451c6f4/333476.png?w=260)
2024. 05. 11.
0
[인프런 워밍업 클럽 스터디 1기] BE 2주차 <두 번째 회고록>
강의 요약Day 7 UserController와 스프링 컨테이너@RestControllerUserController 클래스를 스프링 빈으로 등록시킴스프링 빈서버가 시작되면 스프링 서버 내부에 거대한 컨테이너를 만들게 되는데 이 컨테이너 안에는 여러 클래스가 들어가게 됨이때 다양한 정보도 함께 들어 있고 인스턴스화도 이루어짐JdbcTemplate도 스프링 빈에 등록되어 있음미리 설정해 둔 의존성(Dependency)가 등록해 주고 있었음서버가 시작되면 일어나는 일스프링 컨테이너(클래스 저장소) 시작기본적으로 많은 스프링 빈 등록우리가 설정한 스프링 빈 등록이때 필요한 의존성 자동 설정UserRepository는 JdbcTemplate을 가져오지 못할까?JdbcTemplate을 가져오려면 UserRepository가 스프링 빈이어야 하는데 UserRepository는 스프링 빈이 아님UserRepository를 스프링 빈으로 등록하면 바로 가져올 수 있음UserService와 UserRepository를 스프링 빈으로 등록UserService -> @Service 어노테이션 추가UserRepository -> @Repository 어노테이션 추가이제 3개의 클래스가 서버를 시작할 때 따르는 순서가장 기본적인 스프링 빈 등록JdbcTemplate에 의존하는 UserRepository가 스프링 빈으로 등록UserRepository를 의존하는 UserService가 스프링 빈으로 등록UserService를 의존하는 UserController가 스프링 빈으로 등록스프링 컨테이너를 왜 사용할까?Repository를 다른 Class로 바꾸더라도 BookService를 변경하지 않는 방법Java의 Interface 활용@Primary 어노테이션이 붙어 있는 Repository를 우선 사용스프링 컨테이너의존성 주입(DI, Dependency Injection): 컨테이너가 선택해 BookService에 넣어 주는 과정제어의 역전(IoC, Inversion of Control) 방식스프링 컨테이너를 다루는 방법스프링 빈 등록하는 방법@Configuration클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용해 주어야 함@Bean메소드에 붙이는 어노테이션메소드에 반환되는 객체를 스프링 빈에 등록언제 @Service, @Repository를 사용할까?개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때언제 @Configuration, @Bean을 사용할까?외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때@Component주어진 클래스를 '컴포넌트'로 간주이 클래슬들은 스프링 서버가 뜰 때 자동으로 감지@Component 덕분에 우리가 사용했던 어노테이션이 자동감지Controller, Service, Repository가 모두 아니고 개발자가 직접 작성한 클래스를 스프링 빈으로 등록할 때 사용스프링 빈 주입받는 방법생성자를 이용해 주입받는 방식 (권장)@Autowired 생략 가능 Setter와 @Autowired 사용누군가 setter를 사용하면 오작동할 가능성 있음필드에 직접 @Autowired 사용테스트를 어렵게 만드는 요인@Qualifier@Primary vs @Qualifier사용하는 쪽이 직접 적은 @Qualifier이 우선적Day 8 문자열 SQL을 직접 사용하는 것이 너무 어렵다SQL을 직접 작성하면 아쉬운 점문자열을 작성하기 때문에 실수할 수 있고 실수를 인지하는 시점이 느림컴파일 시점에 발견되지 않고 런타임 시점에 발견됨특정 데이터베이스에 종속적이게 됨반복 작업이 많아지며 테이블을 하나 만들 때마다 CRUD 쿼리가 항상 필요데이터베이스의 테이블과 객체는 패러다임이 다름JPA(Java Persistence API)객체와 관계형 DB의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙Hibernate: 말로 되어 있는 규칙을 코드로 구현한 것Hibernate(구현체)이 JPA를 구현내부적으로 JDBC 사용유저 테이블에 대응되는 Entity Class 만들기Java 객체 MySQL Table 매핑JPA 어노테이션@Entity: Spring이 User 객체와 user 테이블을 같은 것으로 바라봄 @Id: 이 필드를 primary key로 간주@GeneratedValue: primary key는 자동 생성되는 값임@Column: 객체의 필드와 Table 필드 매핑JPA를 사용하기 위해서는 기본 생성자가 반드시 필요JPA 추가 설정ddl_auto: 스프링이 시작할 때 DB에 있는 테이블을 어떻게 처리할지 (create, create-drop, update, validate, none)format_sql: SQL을 보여 줄 때 예쁘게 포맷팅 할 것인가show_sql: JPA를 사용해 DB에 SQL을 날릴 때 SQL을 보여 줄 것인가dialect: 조금씩 다른 SQL을 수정해 줌Spring Data JPA를 이용해 자동으로 쿼리 날리기JPA 기능 정리save: 주어지는 객체를 저장하거나 업데이트findAll: 주어지는 객체가 매핑된 테이블의 모든 데이터 가져옴findById: id를 기준으로 특정한 1개의 데이터 가져옴Spring Data JPA복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리Spring Data JPA를 이용해 다양한 쿼리 작성하기다양한 Spring Data JPA 쿼리By 앞에 들어갈 수 있는 구절 정리find: 1건을 가져옴, 반환 타입은 객체가 될 수도 있고 Optional이 될 수도 있음findAll: 쿼리의 결과물이 N개인 경우 사용, List 반환exists: 쿼리 결과가 존재하는지 확인, 반환 타입은 booleanBy 뒤에 들어갈 수 있는 기능 정리And / Or 조합 가능GreaterThan: 초과GreaterThanEqual: 이상LessThan: 미만LessThanEqual: 이하Between: 사이에StartsWith: ~로 시작하는EndsWith: ~로 끝나는Day 9 트랜잭션 이론편트랜잭션: 쪼갤 수 없는 업무의 최소 단위트랜잭션 시작: start transaction;트랜잭션 정상 종료: commit; (SQL 반영)트랜잭션 실패 처리: rollback; (SQL 미반영)영속성: 모든 SQL을 성공시키거나 하나라도 실패하면 모두 실패시키는 속성트랜잭션 적용과 영속성 컨텍스트@Transactional: 스프링에서 트랜잭션 적용할 때 사용주의사항: IOException과 같은 Checked Exception은 롤백이 일어나지 않음영속성 컨텍스트: 테이블과 매핑된 Entity 객체를 관리 및 보관하는 역할영속성 컨텍스트의 특수 능력변경 감지(Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도 변경을 감지해 자동으로 저장쓰기 지연: DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라 트랜잭션이 commit 될 때 모아서 한 번만 날림1차 캐싱: ID를 기준으로 Entity를 기억함, 이렇게 캐싱된 객체는 완전히 동일Day 10 책 생성 API 개발하기HTTP Method: POSTHTTP Path: /bookHTTP Body (JSON)결과 반환 X (Only HTTP 상태 200)대출 기능 개발하기HTTP Method: POSTHTTP Path: /book/loanHTTP Body (JSON)결과 반환 X (Only HTTP 상태 200)반납 기능 개발하기HTTP Method: PUTHTTP Path: /book/returnHTTP Body (JSON)결과 반환 X (Only HTTP 상태 200)회고1주차 스터디에 이어서 더 딥한 내용을 접하고 직접 사용해 볼 수 있었습니다. 아직 헷갈리는 부분이 있기는 하지만 강의를 반복해서 듣고 부족한 개념을 채워 넣는다면 배포까지 잘 마무리할 수 있을 것 같습니다. 미니 프로젝트까지 잘 완성하는 것이 목표입니다.
백엔드
・
인프런
・
워밍업
・
클럽
・
스터디
・
발자국
![[인프런 워밍업 클럽 스터디 1기] BE 1주차 <첫 번째 회고록>](https://cdn.inflearn.com/public/files/blogs/fc4685d4-3564-49e9-b0ad-1184aebafd0b/333476.png?w=260)
2024. 05. 04.
0
[인프런 워밍업 클럽 스터디 1기] BE 1주차 <첫 번째 회고록>
강의 요약Day 2 새로운 스프링 프로젝트 시작 방법spring initializer 접속Project: 이 프로젝트에서 사용될 ‘빌드 툴’ → 최근에는 Gradle 많이 사용Language: 서버를 개발할 때 사용할 언어 → 최신 프로젝트에는 Kotlin을 사용하는 경향이 있지만 Java로 만들어진 기존 프로젝트가 많이 존재Spring Boot: 스프링 부트의 버전을 고르는 항목 → 알파벳이 붙어 있으면 개발 중이거나 오픈 베타라는 의미, 시간이 지나면서 계속 버전이 업그레이드 되기 때문에 강의를 보는 시점에 따라 다른 숫자가 나올 수 있음버전은 첫 번째 숫자(major), 두 번째 숫자(month), 마지막 숫자(버그 및 간단한 기능 추가)Project MetadataGroup: 프로젝트 그룹Artifact: 최종 결과물 이름Name: 프로젝트 이름Description: 프로젝트 설명Package name: 패키지 이름Packaging: Spring Boot 톰캣이 내장되어 있어 Jar을 선택하면 됨Java: 기존에 존재하는 프로젝트는 Java11이 가장 많고 그 다음은 Java8이 많음 → 최신 프로젝트는 최신 Java 버전을 사용할 수 있음Dependencies: 프로젝트에서 사용하는 라이브러리 / 프레임워크라이브러리: 프로그래밍을 개발할 때 미리 만들어져 있는 기능을 가져다 사용하는 것프레임워크: 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져다 끼워 넣는 것@SpringBootApplication과 서버어노테이션: Java의 문법으로 @ 뒤에 이런저런 문자열을 붙이는 것, 스프링을 실행하기 위해 필요한 다양한 설정들을 모두 자동으로 해 줌Server: 어떠한 기능을 제공하는 프로그램 (컴퓨터)서버와 요청: 기능을 제공하기 위해서는 누군가의 요청 필요네트워크란 무엇인가택배 시스템 네트워크집 컴퓨터주소 IP주소 별칭 도메인 이름택배를 받는 사람 port / 3000HTTP와 API란 무엇인가HTTP(HyperText Transfer Protocol)Protocol: 표준, 약속웹을 통한 컴퓨터 간의 통신은 HTTP라는 표준화된 방식이 있음HTTP MethodHTTP 요청은 HTTP Method(GET, POST)와 Path(/portion)가 핵심GET: HTTP 요청을 받는 컴퓨터에게 요청하는 행위 → 데이터를 달라POST: HTTP 요청을 받는 컴퓨터에게 요청하는 행위 → 저장하라 GET: 데이터를 달라, 쿼리DELETE: 데이터를 삭제하라, 쿼리POST: 데이터를 저장하라, 바디PUT: 데이터를 수정하라, 바디API(Application Programming Interface)클라이언트와 서버는 HTTP를 주고받으며 기능을 동작하는데 이때 정해진 규칙을 API라고 함정해진 약속을 하여 특정 기능을 수행하는 것 URL(Uniform Resource Locator)HTTP Status CodeHTTP/1.1 200 OK Content-Type: application/json { "name":"A", "age":null } 200 → OK300 → Moved Permanently400 → NotFound500 → Internal Server Error요청에서 응답은 상태 코드가 핵심GET API 개발 및 테스트API를 이루고 있는 요소HTTP MethodHTTP Path쿼리 (Key & Value)API의 반환 결과덧셈 API 생성HTTP Method: GETHTTP Path: /add쿼리: int number1 / int number2API의 반환 결과 -> 숫자 (두 숫자의 덧셈 결과)@RestController: 주어진 Class를 Controller로 등록, API의 입구@GetMapping("/add"): 함수를 HTTP Method가 GET이고 HTTP Path가 /add인 API로 지정@RequestParam: 주어지는 쿼리를 함수 파라미터에 넣음Day 3 POST API 개발 및 테스트GET API에서 데이터 받기: 쿼리 이용POST API에서 데이터 받기: HTTP Body 이용JSON(JavaScript Object Notation): 객체 표기법, 무언가를 표기하기 위한 형식으로 중괄호가 양쪽에 있음곱셈 API 생성HTTP Method : POSTHTTP Path: /multiplyHTTP Body (JSON)API 반환 결과: 숫자 (곱셈 결과)유저 생성 API 개발유저 등록 APIHTTP Method: POSTHTTP Path: /userHTTP Body (JSON)결과 반환 X유저 조회 APIHTTP Method: GETHTTP Path: /user쿼리: 없음결과 반환 (JSON)Day 4 Database와 MySQLDatabase: 데이터를 구조화 시켜 저장RDB(Relational Database) - MySQL: 데이터를 표처럼 구조화 시켜 저장SQL(Structured Query Language): 표처럼 구조화된 데이터를 조회하는 언어MySQL 접근 방법 -> MySQL Command List Client (무료)MySQL에서 데이터베이스 생성데이터베이스 생성create database [데이터베이스 이름];데이터베이스 목록 조회show databases;데이터베이스 삭제drop database [데이터베이스 이름];데이터베이스 안으로 접속use [데이터베이스 이름];테이블 생성create table 테이블 이름 ( ... );테이블 제거drop table [테이름 이름];MySQL Type정수: tinyint, int, bigint실수: double, decimal(A,B)문자열: char(A), varchar(A)날짜, 시간 타입: date, time, datetime테이블 데이터 조작C.R.U.DCreate, Retrieve or Read, Update, Delete데이터 넣기INSERT INTO [테이블 이름] (항목) VALUES (값);데이터 조회SELECT * FROM [테이블 이름];데이터 수정UPDATE [테이블 이름] SET 항목 = 값;데이터 삭제DELETE FROM [테이블 이름] WHERE 항목 = 값;Spring에서 Database 사용Spring MySQL 연동을 위한 yaml 파일 작성spring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: driver-class-name: com.mysql.cj.jdbc.Driver이후 유저 테이블 생성, jdbcTemplate를 이용하여 POST API 변경, GET API 변경, 데이터 입력 및 조회Day 5 유저 업데이트 API, 삭제 API 개발과 테스트유저 이름 업데이트HTTP Method: PUTHTTP Path: /userHTTP Body (JSON)결과 반환 X (HTTP Stauts 200)유저 삭제HTTP Method: DELETEHTTP Path: /user쿼리 사용: 문자열 name결과 반환 X유저 업데이트 API, 삭제 API 예외 처리하기SELECT문으로 해당 id나 name을 가진 사용자를 조회한 다음 그 사용자가 없을 시 IllegalArgumentException()으로 예외 처리Day 6 좋은 코드(Clean Code)는 왜 중요한가코드: 요구사항을 표현하는 언어개발자: 요구사항을 구현하기 위해 코드를 읽고 작성Controller에서 모든 기능을 구현하면 안 되는 이유함수는 최대한 작게 한 가지 일만 수행하도록 하는 것이 좋음클래스는 작아야 하며 하나의 책임만을 가져야 함Controller를 3단 분리하기Controller의 함수 1개가 하고 있던 역할API가 진입 지점으로써 HTTP Body 객체 변환 -> Controller 역할현재 유저가 있는지 없는지 확인하고 예외 처리 -> Service 역할SQL을 사용해 실제 Database와의 통신 담당 -> Repository 역할회고부트캠프를 수료한 지 오래되어서 JAVA의 대부분을 까먹었다고 봐도 무방한데 실무에 필요한 부분을 먼저 배우고 기초 지식을 채워나가는 것도 효율적인 방법이라 판단되어 스터디를 시작하게 되었습니다. 아직 알아야 할 것이 더 많지만 애매하게 알고 있었던 부분에 대해 상당히 많이 이해가 되어 신기했고 앞으로의 방향성에 대해서도 고려해 볼 수 있는 1주차였습니다.
백엔드
・
인프런
・
워밍업
・
클럽
・
스터디
・
발자국




