블로그

hmkim199

[워밍업 클럽 0기 BE] 2주차 발자국

학습 내용출처: 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]섹션 4. 생애 최초 JPA 사용하기문자열 SQL을 직접 작성하는 것의 단점문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다.특정 데이터베이스에 종속적이게 된다. 반복작업이 많아진다.데이터베이스의 테이블과 객체는 패러다임이 다르다. => 그래서 JPA가 등장! JPA란? Java Persistence API의 약자로 자바 진영의ORM(Object-Relational Mapping) 기술 표준을 의미.데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙Spring Data JPA4. 영속성 컨텍스트테이블과 매핑된 Entity 객체를 관리/보관하는 역할을 수행스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료변경 감지 (Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는명시적으로 save 를 해주지 않더라도 알아서 변경을 감지하여 저장쓰기 지연 : 트랜잭션이 commit 되는 시점에 SQL을 모아서 한 번만 수행1차 캐싱 : ID를 기준으로 Entity를 기억하는 기능지연 로딩: 필요한 순간에 연결되어 있는 객체를 가져온다. (fetch 옵션 LAZY, EAGER 중 @OneToMany는 LAZY가 기본)섹션 5. 책 요구사항 구현하기상대 테이블을 가리키는 테이블이 연관관계의 주인이다. 연관관계의 주인이 아닌 객체는 mappedBy 를 통해 주인에게 매여 있음을 표시해 주어야 한다.양쪽 모두 연관관계를 갖고 있을 때는 양쪽 모두 한 번에 맺어주는 게 좋다.cascade 옵션을 활용하면, 저장이나 삭제를 할 때 연관관계에 놓인 테이블까지 함께 저장 또는 삭제가 이루어진다.orphanRemoval 옵션을 활용하면, 연관관계가 끊어진 데이터를 자동으로 제거해 준다. 미션6일차7일차의존성 주입을 어디에서 어떻게 하는지를 강의를 들으며, 미션을 하면서 자연스럽게 익히게 되어서 좋았습니다. sql을 직접 사용하는 것과 JPA를 통한 변화가 어떤 차이가 있는지 코드 상으로 확인할 수 있어서 기존에 헷갈리고 불명확한 부분들이 또렷이 보여서 좋았습니다. 회고 및 목표이전에는 @OneToMany와 같은 애노테이션을 어디에 사용하는지, 왜 사용하는 지를 모르고 그냥 동작하게 만들기 위해서 썼는데 2주차 강의를 수강하면서 각 테이블끼리 객체지향적으로 연결시키면서 자연스럽게 이해할 수 있었던 것 같아서 의미있고 재밌게 느껴졌습니다. 영속성 컨텍스트도 어렵게 생각하다가 강의를 들으니 이해가 잘 되어서 좋았고 전반적인 스프링 부트 기술들에 대해 필요성과 관계성 등을 알게 되어 좋았습니다.3주차에는 미니 프로젝트를 하면서 배웠던 것들을 스스로 적용해보고 다시 복습하는 시간을 가지고 싶습니다.

백엔드SpringBootJAVABackend

hmkim199

[워밍업 클럽 0기 BE] 1주차 발자국

학습 내용출처: 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 섹션 1. 생애 최초 API 만들기1. (웹을 통한) 컴퓨터 간의 통신은 HTTP 라는 표준화된 방식이 있다.2. HTTP 요청은 HTTP Method (GET, POST)와 Path(/portion)가 핵심이다.3. 요청에서 데이터를 전달하기 위한 2가지 방법은 쿼리와 바디이다.4. HTTP 응답은 상태 코드가 핵심이다.5. 클라이언트와 서버는 HTTP를 주고 받으며 기능을 동작하는데 이때 정해진 규칙을 API라고 한다.@RestController주어진 Class를 Controller로 등록한다. (Controller : API의 진입 지점)@GetMapping("/add")아래 함수를 HTTP Method가 GET이고 HTTP path가 /add인 API로 지정한다.@RequestParam주어지는 쿼리를 함수 파라미터에 넣는다. @PostMapping(”/multiply”)아래 함수를 HTTP Method가 POST이고 Path가 /multiply인 API로 지정한다.@RequestBodyHTTP Body로 들어오는 JSON을 요청 DTO 로 바꿔준다!HTTP body를 객체로 바꾸는 @RequestBody 를 사용하는 경우는, 생성자를 만들지않아도 괜찮다. API의 응답 결과를 JSON으로 반환하는 방법: Controller에서 그냥 객체를 반환하면, JSON으로 응답되며 객체에는 getter가 있어야 함-> getter 없는 객체 반환하면? 에러났음. (Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]) 섹션 2. 생애 최초 Database 조작하기CPU : 연산담당RAM : 메모리, 단기기억DISK : 장기기록우리가 서버를 실행시켜 API를 동작시키기까지 이 3가지 장치는 다음과 같은 역할을 수행1. 우리가 개발하고 있는 스프링 부트 서버는 DISK에 파일로 잠들어 있다.2. 서버를 실행시키면 DISK에 있는 코드 정보가 RAM으로 복사된다.3. API가 실행되면 ‘연산'이 수행되며, CPU와 RAM을 왔다 갔다 한다.4. 즉 POST API를 통해 생긴 유저 정보는 RAM에 쓰여 있다.5. 만약 서버가 종료되면 RAM에 있는 모든 정보가 사라진다.6. 때문에 다시 서버를 시작하면, 유저 정보가 없는 것이다!-> 서버에서는 Java에 있는 File 클래스를 사용해 직접 DISK에 접근할 수도 있지만, 이럴 때 바로 Database를 사용할 수 있다. 섹션 3. 역할의 분리와 스프링 컨테이너함수 하나로 모든 기능을 구현한다면?1. 그 함수를 동시에 여러 명이 수정할 수 없다.2. 그 함수를 읽고, 이해하는 것이 너무 어렵다.3. 그 함수의 어느 부분을 수정하더라도 함수 전체에 영향을 미칠 수 있기 때문에 함부로건들 수 없게 된다.4. 너무 큰 기능이기 때문에 테스트도 힘들다.5. 종합적으로 유지 보수성이 매우 떨어진다. 기존 컨트롤러에서 모든 기능을 구현했을 때의 컨트롤러 역할1. API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다.2. 현재 유저가 있는지, 없는지 등을 확인하고 예외 처리를 해준다.3. SQL을 사용해 실제 DB와의 통신을 담당한다.-> 각각을 Controller, Service, Repository로 분리! 미션1일차2일차3일차4일차 1주차 미션을 수행하면서는 학습한 것을 스스로 적용할 수 있도록 하는 것에 가장 집중하였습니다. 2일차 과제를 해결하며 Json 배열 받는 방법(List를 요청 DTO에서 필드로 갖기), Getter나 생성자가 없는 경우 발생하는 에러 등을 겪으면서 새로운 문제를 마주하고 해결하는 방법을 알게 되었습니다. 회고 및 목표회사와 함께 스터디를 병행하니 4-5일차 과제는 수행하지 못해서 아쉬웠습니다. 하지만 2주차 학습을 진행하며 틈틈이 1주차에 미흡했던 부분을 보완하고자 합니다.4일차 추가: 2024-02-26 

백엔드SpringBootJAVABackend

[워밍업 스터디 클럽 0기 BE] 1강 정리 및 공부

✏ ️강의 링크 - https://inf.run/XKQg 스프링 프로젝트 설정 시작 및 실행서버란 ? 네트워크와 HTTP, API란 ? JSON ? 서버 개발에 필요한 다양한 개념 이해스프링 부트를 이용해 GET API, POST API 만들기 스프링 프로젝트 설정 시작 및 실행: https://start.spring.io- Project : 빌드 툴 Gradle, Maven- Language : 사용하는 언어- Spring Boot : 버전- Packaging : Jar, War ( 부트는 톰캣 - Jar)- Java : 의 버전! Dependencies ( 의존성 설정 )라이브러리란 ?: 프로그래밍을 개발할 때 미리 만들어져 있는 기능을 가져다 사용하는 것프레임워크란 ?: 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져다 끼워 넣는 것서버(Server)란 ?: 어떠한 기능을 제공하는 프로그램, 실행시키고 있는 컴퓨터 ( ex: 회원가입 기능, 추천 기능 )but 기능 제공을 위해서는 누군가의 요청이 필요, 서버 요청은 인터넷을 통해 함네트워크란 ?IP, portIP를 외우기 어려운 숫자 대신 Domain Name 등장Domain Name System (DNS)- IP 244.66.51.9 = 도메인 이름 spring.com HTTP, API란?: HTTP (HyperText Transfer Protocol)Protocol : 표준, 약속지켜야할 규칙GET /portion?color=red/portion : Path? : QueryHTTP Method ( 요청을 받는 컴퓨터에게 요청하는 행위 )GET 제공 Query(ket & value)POST 저장 BodyPUT 수정 BodyDELETE 삭제 QueryHost: spring.com:3000 URL (Uniform Resource Locator): 주소창 http://spring.com:3000/portion?color=red  Post에는 @RequestBody를 사용 Response 부분에서 User user 적용하면users.get 으로 간편하게 users.get으로 선언가능 따로 name과 age 각각 쓰지않아도됨

워밍업JAVASpringBoot

[인프런 워밍업 클럽] 과제 3일차

진도표 3일차와 연결됩니다우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊 [키워드]익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스 [질문]자바의 람다식은 왜 등장했을까?람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?    자바의 람다식은 왜 등장했을까?자바의 람다식은 코드의 간결성과 함수형 프로그래밍의 도입을 위해 등장했다.람다식을 사용하면 익명 클래스를 생성하고 이를 바로 사용하는 과정을 단순화 시킬 수 있다.이를 통해 코드가 간결해지며 가독성이 향상된다.람다식은 함수형 프로그래밍 패러다임을 자바에 도입하는데 중요한 역할을 한다. 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는메소드의 이름이 불필요하다고 여겨져서 이를 사용하지 않는다.대신 컴파일러가 문맥을 살펴 타입을 추론한다.  람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?람다식과 익명 클래스는 둘 다 이름없이 사용되는 함수형 프로그래밍 요소이다.익명 클래스는 클래스 선언과 객체 생성을 한번에 수행하는 방법으로서 일반적으로 인터페이스를 구현하거나 클래스를 상속받아 메서드를 오버라이드 하는데 사용된다.람다식은 익명클래스를 더 간결하게 표현한 형태라고 볼 수 잇다. 람다식은 함수형 인터페이스를 구현하는데 사용된다. 함수형 인터페이스는 단 하나의 추상 메서드만을 가진 인터페이스를 말한다. 람다식 문법// 람다식의 기본 문법 (parameters, ... ) -> { body } /* parameters: 람다식이 받는 매개변수 리스트. 매개변수 타입은 생략 가능 >: 람다식의 표시 body: 람다식의 본문. 식 혹은 문장을 작성 가능. 만약 본문이 한 문장만 있는 경우 중괄호 {}를 생략 가능 */ // 예시 (int a, int b) -> { return a + b; }익명 클래스 문법new SomeFunctionalInterface() { @Override public int someMethod(int a, int b) { return a + b; } } 람다식은 더 간결하게 표현된다.  

백엔드JAVA인프런워밍업클럽

[인프런 워밍업 클럽] 과제 2일차

진도표 2일차와 연결됩니다우리는 GET API와 POST API를 만드는 방법을 배웠습니다. 👍 추가적인 API 들을 만들어 보며 API 개발에 익숙해져 봅시다! Controller@RestController public class CalculatorController { @GetMapping("/api/v1/calc") public CalcRequest calc(@RequestParam int num1, @RequestParam int num2) { CalcRequest request = new CalcRequest(); request.setAdd(num1 + num2); request.setMinus(num1 - num2); request.setMultiply(num1 * num2); return request; } }DTO public class CalcRequest { private int add; private int minus; private int multiply; public int getAdd() { return add; } public int getMinus() { return minus; } public int getMultiply() { return multiply; } public void setAdd(int add) { this.add = add; } public void setMinus(int minus) { this.minus = minus; } public void setMultiply(int multiply) { this.multiply = multiply; } }결과Controller @GetMapping("/api/v1/day-of-the-week") public DayResponse getDayofWeek(@RequestParam String date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(date, formatter); String dayOfWeek = localDate.getDayOfWeek().getDisplayName( TextStyle.SHORT, Locale.US).toUpperCase(); DayResponse response = new DayResponse(); response.setDayOfTheWeek(dayOfWeek); return response; } DTO public class DayResponse { private String dayOfTheWeek; public String getDayOfTheWeek() { return dayOfTheWeek; } public void setDayOfTheWeek(String dayOfTheWeek) { this.dayOfTheWeek = dayOfTheWeek; } } 결과DTOpublic class SumRequst { private List<Integer> numbers; public List<Integer> getNumbers() { return numbers; } public void setNumbers(List<Integer> numbers) { this.numbers = numbers; } } Controller @PostMapping("api/v1/sum") public int sumNumbers(@RequestBody SumRequst requst) { return requst.getNumbers().stream().mapToInt(Integer::intValue).sum(); }결과{ "numbers" : [1, 2, 3, 4, 5] }

백엔드JAVA인프런워밍업클럽

망그리

[인프런 워밍업 클럽] 1일차 과제

진도표 1일차와 연결됩니다우리는 최초로 API를 만들어 보았습니다. GET API를 만들기 위해 사용했던 어노테이션에 익숙하지 않다면 자바 어노테이션에 대해서 몇 가지 블로그 글을 찾아보세요! 다음 질문을 생각하며 공부해보면 좋습니다! 😊[질문]어노테이션을 사용하는 이유 (효과) 는 무엇일까?나만의 어노테이션은 어떻게 만들 수 있을까?> 어노테이션을 사용하는 이유(효과) 는 무엇일까?어노테이션이란, @로 시작하는 코드이고어떤 용도로 사용할지, 어떤 역할을 부여할지 결정한다.  어노테이션의 장점은간결하다로직을 방해하지 않는다.정보를 제공한다. 어노테이션은 자식 클래스에 여러개의 메소드가 정의되어 있을 때 사용한다.그리고 컴파일러에게 문법 체크를 하도록 알려주는 기능이 있어서 컴파일 하기 전에 컴파일러가 이러한 사항을 체크해주며,프로그램 작성을 위해 매번 많은 설정을 해야하며, 수 많은 설정 파일들을 관리해야했지만 이 문제점을 해결하기 위해 고안된 문법이 어노테이션이라고 한다. 그래서 사용하는 이유는 쉽게 파악할 수 있게 되는 점과 오류 감소라고 생각한다.   > 나만의 어노테이션은 어떻게 만들 수 있을까? 어노테이션 유형 package com.xxx.xxx; public @interface TODO{ String value(); }  package com.group.libraryapp.controller.calculator; import com.group.libraryapp.controller.dto.calculator.request.CalculatorAddRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class CalculatorController { @GetMapping("/add") // GET /add public int addTwoNumbers(CalculatorAddRequest request) { return request.getNumber1() * request.getNumber2(); } }  수강하면서 배운 계산기 어노테이션 +가 아니라 *나 /로도 실행해보았다. 

백엔드워밍업스터디백엔드자바JAVA