ejej
수강평 작성수
-
평균평점
-
블로그
전체 3#카테고리
- 백엔드
#태그
- 인프런워밍업클럽
- 백엔드
![[인프런 워밍업 스터디 클럽 1기 BE] 세 번째 발자국](https://cdn.inflearn.com/public/files/blogs/0bedd14a-5572-4862-b7cf-ad1813b32c6c/썸네일.png?w=260)
2024. 05. 19.
1
[인프런 워밍업 스터디 클럽 1기 BE] 세 번째 발자국
3주차 5/13 - 5/17출처 : 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]Section 5 책 요구사항 구현하기목표책 생성, 대출, 반납 API를 온전히 개발하며 지금까지 다루었던 모든 개념을 실습해본다.객체지향적으로 설계하기 위한 연관관계를 이해하고, 연관관계의 다양한 옵션에 대해 이해한다.JPA에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점을 이해한다.객체지향과 JPA 연관관계연관관계의 주인 : Table을 바라봤을 때 누가 관계의 주도권을 가지고 있는지를 의미JPA 연관관계1:1 관계 → 테이블에서 둘의 관계를 표현하기 위해 한 테이블이 다른 테이블의 id를 가지고 있어야 한다.@OneToOne 어노테이션연관관계의 주인이 아닌 쪽에 mappedBy 옵션 (주인에게 매여있다)1:N 관계@OneToMany + @ManyToOne 어노테이션@JoinColumn 어노테이션 : 연관관계의 주인에게 활용N:M 관계@ManyToMany 어노테이션구조가 복잡하고, 테이블이 직관적으로 매핑되지 않기 때문에 사용하지 않는 것이 좋다.cascade 옵션 : 한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능orphanRemoval 옵션 : 연관관계가 끊어진 데이터를 자동으로 제거해주는 기능 Section 6 생애 최초 배포 준비하기목표배포가 무엇인지 이해하고, 배포를 하기 위해 어떤 준비를 해야 하는지 알아본다.스프링 서버를 실행할 때 DB와 같은 설정들을 코드 변경 없이 제어할 수 있는 방법을 알아본다.git과 github의 차이를 이해하고 git에 대한 기초적인 사용법을 알아본다.AWS의 EC2가 무엇인지 이해하고, AWS를 통해 클라우드 컴퓨터를 빌려본다.기본적인 배포를 위한 준비배포란?우리 컴퓨터에 있는 코드를 전용 컴퓨터로 옮기고 java나 MySQL 등을 설치하고 실행하는 것을 의미똑같은 서버 코드를 실행시키지만, 실행될 때의 설정을 다르게 하고 싶을 때, profile 사용git과 githubgit : 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램github : git으로 관리되는 프로젝트의 코드가 저장되는 저장소 Section 7 생애 최초 배포하기목표EC2에 접속하는 방법을 알아보고, EC2에 접속해 리눅스 명령어를 다뤄본다.개발한 서버의 배포를 위해 환경 세팅을 리눅스에서 진행하고, 실제 배포를 진행한다.foreground와 background의 차이를 이해하고 background 서버를 제어한다.도메인 이름을 사용해 사용자가 IP 대신 이름으로 접속할 수 있도록 한다.AWS와 EC2 배포EC2에 접속하기 위한 준비우리가 접속하려 하는 EC2의 IP 주소이전 시간에 다운로드 받았던 키 페어 (pem 키)접속하기 위한 프로그램 (Mac - terminal)리눅스 및 Gradle 명령어mkdir : 폴더 생성ls : 현재 위치에서 폴더나 파일 확인ls -l : 조금 더 자세한 정보 확인cd : 폴더 안으로 이동cd .. : 상위 폴더로 이동pwd : 현재 위치 확인rmdir : 비어 있는 폴더(디렉토리) 제거sudo yum update : 관리자의 권한으로 설치되어 있는 여러 프로그램 최신화sudo yum install 프로그램 이름 : 관리자의 권한으로 프로그램 설치sudo systemctl status 프로그램 : 프로그램의 상태 확인sudo systemctl restart 프로그램 : 프로그램 재시작chmod : 파일이나 폴더의 권한 변경ctrl + c : foreground로 실행 중인 프로그램을 중단하는 신호nohup [명령어]& : 명령어를 background로 실행rm : 파일 제거vi : 리눅스 편집기인 vim을 이용해 파일을 염cat : 파일에 있는 내용물을 모두 출력tail : 현재 파일의 끝부분 출력tail -f : 현재 파일의 끝부분을 실시간으로 출력ps aux : 현재 실행 중인 프로그램 목록 확인ps aux | grep java : java가 들어가는 프로그램 목록 확인kill -9 프로그램 번호 : 해당 프로그램 종료./gradlew build : 프로젝트 빌드./gradlew build -x test : 프로젝트를 빌드하는데, 테스트 생략./gradlew clean : 현재 빌드된 결과물 제거과제과제 6과제 73주차 회고벌써 3주차..! 인프런 워밍업 클럽을 알게 되자마자 백엔드 공부에 대한 욕심에 신청해버렸기 때문에 인턴, 자격증 등등 생각보다 많은 걸 같이 병행하게 되어버렸다.. 충분한 시간 투자를 못 했던 것 같아 아쉬운 마음이 든다. 하지만 백엔드 전반에 대해 어렴풋이 감이 잡히는 것 같다는 자신감과 함께 더 딥한 공부를 하기 위한 밑바탕을 마련한 것 같다! 그리고 사실 이 강의 이전에 독학으로 팀플에서 백엔드로 참여했을 때 배포가 진짜 너무너무 어렵고 멀게 느껴졌는데, 강의를 통해 실습해보면서 그때 그렇게 겁먹을 필요가 없었는데 라는 생각이 들었다. 그땐 강의를 듣기 전이었으니깐 🤓미니 프로젝트까지 잘 마무리하자!
백엔드
・
인프런워밍업클럽
・
백엔드
![[인프런 워밍업 스터디 클럽 1기 BE] 두 번째 발자국](https://cdn.inflearn.com/public/files/blogs/719b7ad9-e9d9-48a2-8565-b2f9c1a96d07/썸네일.png?w=260)
2024. 05. 12.
1
[인프런 워밍업 스터디 클럽 1기 BE] 두 번째 발자국
2주차 5/7 - 5/10Section 3 역할의 분리와 스프링 컨테이너목표좋은 코드가 왜 중요한지 이해하고, 원래 있던 Controller 코드를 보다 좋은 코드로 리팩토링한다.스프링 컨테이너와 스프링 빈이 무엇인지 이해한다.스프링 컨테이너가 왜 필요한지, 좋은 코드와 어떻게 연관이 있는지 이해한다.스프링 빈을 다루는 여러 방법을 이해한다.스프링 컨테이너스프링 빈 (Spring Bean)서버가 시작되면, 스프링 서버 내부에 거대한 컨테이너를 만들게 된다.컨테이너 안에는 클래스가 들어가게 된다. 이때 다양한 정보도 함께 들어있고, 인스턴스화도 이루어진다.→ 스프링 컨테이너 안으로 들어간 클래스를 스프링 빈이라고 한다.cf) JdbcTemplate도 Dependency (의존성)에 의해 스프링 빈으로 등록되어 있다.서버가 시작되면스프링 컨테이너(클래스 저장소)가 시작된다.기본적으로 많은 스프링 빈들이 등록된다. 예를 들어, JdbcTemplate이 등록된다.우리가 설정해준 스프링 빈이 등록된다. 예를 들어, UserController가 등록된다.이때 필요한 의존성이 자동으로 설정된다. 예를 들어, UserController를 만들 때 JdbcTemplate을 알아서 넣어준다.Repository와 Service 스프링 빈 등록하는 방법Repository를 스프링 빈으로 등록할 때는 @Repository 어노테이션 사용Service를 스프링 빈으로 등록할 때에는 @Service 어노테이션 사용 ⇒ UserController는 UserService가 스프링 빈이니 굳이 직접 new 연산자를 통해 인스턴스화해줄 필요가 없다! 또한 UserRepository가 JdbcTemplate을 직접 가지고 있기 때문에 JdbcTemplate도 가지고 있을 필요도 없어진다.스프링 컨테이너를 왜 사용할까?스프링 컨테이너를 이용하는 이유컨테이너가 BookService를 대신 인스턴스화하고, 그 때 알아서 BookMemoryRepository 혹은 BookMySqlRepository 중 하나를 BookRepository로 결정해준다!= 제어의 역전 (IoC, Inversion of Control)이때 컨테이너가 BookService를 만들어 줄 때 BookMemoryRepository와 BookMySqlRepository 중 하나를 선택해서 넣어주는 과정= 의존성 주입 (Dependency Injection)- @Primary 어노테이션을 이용해 우선권을 제어할 수 있다.책 이름을 메모리에 저장하는 API 예시controller > book > BookController.javapackage com.group.libraryapp.controller.book; import com.group.libraryapp.service.book.BookService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class BookController { // new BookService() 안해도 됨! private final BookService bookService; // constructor public BookController(BookService bookService) { this.bookService = bookService; } @PostMapping("/book") public void saveBook() { bookService.save(); } } service > book > BookService.javapackage com.group.libraryapp.service.book; import com.group.libraryapp.repository.book.BookRepository; import org.springframework.stereotype.Service; @Service // 어노테이션 추가 public class BookService { private final BookRepository bookRepository; public BookService(BookRepository bookRepository) { this.bookRepository = bookRepository; } public void save() { bookRepository.save(); } } repository > book > BookMemoryRepository.javapackage com.group.libraryapp.repository.book; import org.springframework.stereotype.Repository; @Repository // 어노테이션 추가 public class BookMemoryRepository implements BookRepository{ @Override public void save() { System.out.println("Memory Repository"); // 테스트용 출력 } } repository > book > BookMySqlRepository.javapackage com.group.libraryapp.repository.book; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @Primary // 우선권을 부여하는 어노테이션 @Repository public class BookMySqlRepository implements BookRepository { @Override public void save() { System.out.println("MySql Repository"); // 테스트용 출력 } } 스프링 컨테이너를 다루는 방법빈을 등록하는 방법@Configuration클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용해줘야 한다!@Bean메소드에 붙이는 어노테이션메소드에서 반환되는 객체를 스프링 빈에 등록한다.@Component주어진 클래스는 ‘컴포넌트’로 간주1) 컨트롤러, 서비스, 리포지토리가 모두 아니고 2) 개발자가 직접 작성한 클래스를 스프링 빈으로 등록할 때 사용@Service + @Repository vs @Configuration + @Bean개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때 => @Service + @Repository외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 => @Configuration + @Bean스프링 빈을 주입받는 방법(가장 권장) 생성자를 이용해 주입받는 방식@RestController public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; }setter와 @Autowired 사용@Autowired public void setUserController(UserService userService) { this.userService = userService; }→ 누군가 setter를 사용하면 오작동할 수 있다.필드에 직접 @Autowired 사용@Autowired private final UserService userService;→ 테스트를 어렵게 만드는 요인이다.스프링 빈의 우선순위 설정@Qualifier 사용스프링 빈을 사용하는 쪽에서만 쓰면, 빈의 이름을 적어주어야 한다.양쪽 모두 사용하면, @Qualifier끼리 연결된다!@Primary vs @Qualifier → 사용하는 쪽에서 직접 적어준 @Qualifier가 이긴다!Section 4 생애 최초 JPA 사용하기목표문자열 SQL을 직접 사용하는 것의 한계를 이해하고, 해결책인 JPA, Hibernate, Spring Data JPA가 무엇인지 이해한다.Spring Data JPA를 이용해 데이터를 생성, 조회, 수정, 삭제할 수 있다.트랜잭션이 왜 필요한지 이해하고, 스프링에서 트랜잭션을 제어하는 방법을 익힌다.영속성 컨텍스트와 트랜잭션의 관계를 이해하고, 영속성 컨텍스트의 특징을 알아본다.Spring Data JPA를 사용한 데이터베이스 조작JPA (Java Persistence API) 개념Persistence (영속성 ) : 데이터를 생성한 프로그램이 종료되더라도 데이터가 영구적인 속성을 갖는 것API : 정해진 규칙JPA : 객체와 관계형 데이터베이스의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙 / ORM (Object-Relational Mapping) 기술 표준JPA를 실제 코드로 작성한 가장 유명한 프레임워크 = Hibernate (내부적으로 JDBC 사용) Entity= 저장되고 관리되어야 하는 데이터user 객체에 @Entity 어노테이션 붙여주기@Entity를 붙이게 되면, 스프링이 이를 인식하여 서버가 동작할 때, User 객체와 user 테이블을 같은 것으로 간주@Column 어노테이션 : column에 붙여주기, 다양한 옵션 (필드에 null이 들어갈 수 있는지의 여부, 길이 제한, DB에서의 column 이름 설정 등) 최초로 JPA를 적용할 때application.yml 파일에 설정 추가!Spring Data JPA를 이용해 자동으로 쿼리 날리기 (기능 리팩토링)save : 주어지는 객체를 저장하거나 업데이트해준다.findAll : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.findById : id를 기준으로 특정한 1개의 데이터를 가져온다.User : 이름을 기준으로 유저 데이터를 조회해 유저 객체를 반환한다. (유저 정보가 없다면, null)findByName : name을 기준으로 특정한 1개의 데이터를 가져온다. (함수 이름만 작성하면 알아서 SQL 조립)Spring Data JPA의 추가적인 쿼리 작성법 조사 및 연습!트랜잭션과 영속성 컨텍스트트랜잭션여러 SQL을 사용해야 할 때 한 번에 성공시키거나, 하나라도 실패하면 모두 실패시키는 기능→ 쪼갤 수 없는 업무의 최소 단위commit : 트랜잭션이 시작된 후 사용된 SQL을 성공적으로 반영rollback : 트랜잭션을 시작하고 사용한 SQL을 모두 취소UserService에 트랜잭션 적용메소드에 @Transactional 어노테이션 붙여주기주의) org.springframework.transaction.annotation.Transactional데이터의 변경이 없고, 조회 기능만 있을 때는 readOnly 옵션영속성 컨텍스트테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 역할변경 감지 (Dirty Check) : 영속성 컨텍스트 안에 불러와진 Entity는 명시적으로 save를 해주지 않더라도 알아서 변경을 감지해 저장할 수 있게 해준다.쓰기 지연 : 트랜잭션이 commit 되는 시점에 여러 SQL을 모아서 한 번만 날린다.1차 캐싱 : ID를 기준으로 Entity를 기억한다/Section 5 책 요구사항 구현하기목표책 생성, 대출, 반납 API를 온전히 개발하며 지금까지 다루었던 모든 개념을 실습해본다.객체지향적으로 설계하기 위한 연관관계를 이해하고, 연관관계의 다양한 옵션에 대해 이해한다.JPA에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점을 이해한다. 조금 더 복잡한 기능을 API로 구성하기책 생성 API, 대출 기능, 반납 기능 구현 과제과제 4과제 52주차 회고이번 주차에 스프링의 굵직굵직한 개념들이 등장했는데, 코드 예시와 함께 단계별로 적용해보는 강의 내용이 이해에 도움이 많이 되었다. 특히 과제를 해결하고자 고민하는 과정에서 재미있고 자신감도 붙는 것 같다. 강의의 흐름을 따라가면서 더 공부해야 할 것들이 차곡차곡 정립되고 있다. 그때그때 찾아보고 적어두고 지식 불리기 중! 클린 코드 책도 읽겠다는 목표도 세웠다.벌써 절반을 훌쩍 넘어버렸으니 다음 주는 더더 화이팅!
백엔드
・
인프런워밍업클럽
・
백엔드
![[인프런 워밍업 스터디 클럽 1기 BE] 첫 번째 발자국](https://cdn.inflearn.com/public/files/blogs/8d15c357-8d24-4412-961b-0554c28b3409/썸네일.png?w=260)
2024. 05. 06.
1
[인프런 워밍업 스터디 클럽 1기 BE] 첫 번째 발자국
1주차 4/29 - 5/3Section 1 생애 최초 API 만들기목표스프링 프로젝트를 설정해 시작하고 실행할 수 있다.서버란 무엇인지, 네트워크와 HTTP, API는 무엇인지, JSON은 무엇인지 등 서버 개발에 필요한 다양한 개념을 이해한다.스프링 부트를 이용해 간단한 GET API, POST API를 만들 수 있다.@SpringBootApplication과 서버@SpringBootApplication = 어노테이션어노테이션 : Java의 문법으로 @ 뒤에 문자열을 붙이는 것 → 마법같은 일을 해주는 기호서버란?어떠한 기능을 제공하는 프로그램 /그 프로그램을 실행시키고 있는 컴퓨터네트워크란 무엇인가?포트 (port): 그 컴퓨터 안에 동작하는 여러 프로그램 중에 특정한 하나의 프로그램을 가리키는 것 (컴퓨터에서 돌고 있는 여러 프로그램 중 하나만 특정)IP 주소 : 컴퓨터마다 갖는 고유한 주소도메인 이름 : 244.66.51.9라는 외우기 어려운 숫자 대신, 사람이 외우기 쉬운 이름을 사용하는 것 ex) 도메인 이름 : spring.com, port : 3000→ Domain Name System (DNS)HTTP와 API란 무엇인가?HTTP (HyperText Transfer Protocol) : 데이터를 주고 받는 표준 → 컴퓨터 간의 통신HTTP Method : GET, POST, PUT, DELETEHTTP 요청 : HTTP Method (GET, POST)와 Path (/portion)가 핵심 / 쿼리와 바디로 데이터를 전달HTTP 응답 : 상태 코드가 핵심API (Application Programming Interface) :정해진 약속을 하여, 특정 기능을 수행하는 것GET API 개발하고 테스트하기@RestController public class CalculatorController { @GetMapping("/add") // GET /add public int addTwoNumbers( @RequestParam int number1, @RequestParam int number2 ) { return number1 + number2; } }POST API 개발하고 테스트하기@PostMapping("/multiply") // POST /multiply public int multipltTwoNumbers(@RequestBody CalculatorMultiplyRequest request) { return request.getNumber1() * request.getNumber2(); }유저 생성 API 개발유저 생성 API 스펙HTTP Method : POSTHTTP Path : /userHTTP Body (JSON){ "name": String (null 불가능), "age": Integer } 결과 반환 X (HTTP 상태 200 OK이면 충분)private final List users = new ArrayList(); @PostMapping("/user") // POST /user public void saveUser(@RequestBody UserCreateRequest request) { users.add(new User(request.getName(), request.getAge())); }유저 조회 API 개발과 테스트유저 조회 API 스펙HTTP Method : GETHTTP Path : /user쿼리 : 없음결과 반환[{' "id": Long, "name": String (null 불가능), "age": Integer }, ...] @GetMapping("/user") public List getUsers() { List responses = new ArrayList(); for (int i = 0; i Section 2 생애 최초 Database 조작하기목표 1. 디스크와 메모리의 차이를 이해하고, Database의 필요성을 이해한다.2. MySQL Database를 SQL과 함께 조작할 수 있다.3. 스프링 서버를 이용해 Database에 접근하고 데이터를 저장, 조회, 업데이트, 삭제할 수 있다.4.API의 예외 상황을 알아보고 예외를 처리할 수 있다.Database와 MySQL컴퓨터의 핵심 부품 : CPU (연산 담당), RAM (메모리, 단기기억), DISK (장기기록)서버를 실행시켜 API를 동작시키기까지 일어나는 일서버 실행 → DISK의 코드 정보 RAM으로 복사 → API 실행 → 연산 수행 (CPU-RAM)Database :데이터를 구조화시켜 저장하는 장치RDB (Relational Database) : MySQL데이터를 표처럼 구조화시켜 저장하는 장치SQL (Structured Query Language) :표처럼 구조화된 데이터를 조회하는 언어MySQL에 접근하는 방법 터미널에서 mysql -u root -p + 비밀번호비밀번호 없으면 mysql -u rootMySQL에서 테이블 만들기DDL (Data Definition Language) : 데이터를 정의하기 위한 SQLMySQL 명령어데이터베이스 생성, 조회, 삭제create database [데이터베이스 이름]; show databases; drop database [데이터베이스 이름]; 테이블 생성, 조회, 삭제use [데이터베이스 이름]; show tables; create table [테이블 이름] ( [필드1 이름] [타입] [부가조건], [필드2 이름] [타입] [부가조건], ... primary key ([필드 이름]) ); drop table [테이블 이름]; 예시create table fruit ( id bigint auto_increment, name varchar(20), price int, stocked_date date, primary key (id) );SQL의 데이터 타입정수 타입tinyint : 1바이트 정수int : 4바이트 정수bigint : 8바이트 정수실수 타입double : 8바이트 실수decimal(A, B) : 소수점을 B개 가지고 있는 전체 A 자릿수 실수문자열 타입char(A) : A글자가 들어갈 수 있는 문자열varchar(A) : 최대 A글자가 들어갈 수 있는 문자열날짜, 시간 타입data : 날짜, yyyy-MM-dd 형식으로 들어간다.time : 시간, HH:mm:ss 형식으로 들어간다.datetime : 날짜와 시간을 합친 형식, yyyy-MM-dd HH:mm:ss 형식으로 들어간다.테이블의 데이터 조작하기DML (Data Manipulation Language) : 데이터를 조작하기 위한 SQLCRUD데이터를 넣는다 (생성 - Create) 조회한다 (읽기 - Retrieve or Read)수정한다 (업데이트 - Update)삭제한다 (제거 - Delete)Createinsert into [테이블 이름] (필드1이름, 필드2이름, ...) values (값1, 값2, ...) insert into fruit (name, price, stocked_date) values ('사과', 1000, '2023-01-01');Read select * from [테이블 이름]; select name, price from fruit; # 조건을 통해 필터 적용 select * from [테이블 이름] where [조건]; select * from fruit where name = '사과'; # and, or select * from fruit where name = '사과' and price Updateupdate [테이블 이름] set 필드1이름=값1, 필드2이름=값2, ... where [조건]; # 모든 사과의 가격을 2000 -> 1000원으로 변경 update fruit set price=1500 where name = '사과';Deletedelete from [테이블 이름] where [조건]; delete from fruit where name = '사과';Section 3 역할의 분리와 스프링 컨테이너목표좋은 코드가 왜 중요한지 이해하고, 원래 있던 Controller 코드를 보다 좋은 코드로 리팩토링한다.스프링 컨테이너와 스프링 빈이 무엇인지 이해한다.스프링 컨테이너가 왜 필요한지, 좋은 코드와 어떻게 연관이 있는지 이해한다.스프링 빈을 다루는 여러 방법을 이해한다.Clean Code와 Controller-Service-Repository 3단 분리Clean Code 중함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.클래스는 작아야 하며 하나의 책임만을 가져야 한다.Controller가 하고 있던 역할 분리API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다. → Controller의 역할현재 유저가 있는지, 없는지 등을 확인하고 예외 처리를 해준다. → Service의 역할SQL을 사용해 실제 DB와의 통신을 담당한다. → Repository의 역할코드 리팩토링 예시 - UPDATE API// Controller @PutMapping("/user") public void updateUser(@RequestBody UserUpdateRequest request) { userService.updateUser(request); } // Service public void updateUser(UserUpdateRequest request) { if (userRepository.isUserNotExist(request.getId())) { throw new IllegalArgumentException(); } userRepository.updateUserName(request.getName(), request.getId()); } // Repository public boolean isUserNotExist(long id) { String readSql = "SELECT * FROM user WHERE id = ?"; return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty(); } public void updateUserName(String name, long id) { String sql = "UPDATE user SET name = ? WHERE id = ?"; jdbcTemplate.update(sql, name, id); }과제과제 2과제 31주차 회고스터디가 갖는 가장 큰 장점! 공통의 목표를 갖고 모인 다른 스터디원들과 함께 공부하니까 동기부여가 된다. 혼자였으면 이런 꾸준함이 덜하지 않았을까? 그리고 멘토님도 계셔서 유익했던 라이브세션과 강의를 듣는 동안의 든든함이 스터디에 참여하기 잘했다라는 생각이 들게 한다.그리고 강의 너무 좋다..! 백엔드 개발을 지망하면서 다른 언어를 먼저 접하고, 자바와 스프링을 가장 늦게 배우고 있는 상황이었다. 백엔드 개발의 전반부터 다루고 시작하니 조각조각 알던 지식들이 한 줄기로 모여서 흐름을 잡기에 너무 좋았다. 다만 첫주에 직무 교육과 개인 일정이 겹쳐 제공된 진도를 다 수행하지 못하였는데, 2주차에 시간을 더 내어 보완하도록 할 것이다. SQL은 최근 정처기 실기에서 주요 문법 위주로 빠르게 훑었었는데 직접 실습하니까 복습도 되고 더 기억에도 남는 것 같다. 그리고 자바 공부가 더 필요하다는 것을 느껴 약간 미뤄두었던 '이것이 자바다' 완독을 곧 다시 시작할 것 같다.. 2주차엔 더더 화이팅! 😀
백엔드
・
인프런워밍업클럽
・
백엔드




