박상범
@tkdqja21966154
수강평 작성수
-
평균평점
-
블로그
전체 4![[인프런 워밍업 클럽] BE 0기 과제 #4 과일가게API](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 22.
0
[인프런 워밍업 클럽] BE 0기 과제 #4 과일가게API
문제1.과일의 정보를 입력하기 위해 데이터베이스와 테이블을 만들어주었다.그 후 요청한 과일 정보를 저장하기 위한 FruitSaveRequest클래스를 만들어준다.package com.group.libraryapp.dto.fruit.request; import java.time.LocalDate; public class FruitSaveRequest { private String name; private LocalDate warehousingDate; private long price; public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public long getPrice() { return price; } }API가 담긴 FruitController의 POSTAPI 실행 결과문제 2.판매한 과일을 기록하기 위하여 id를 사용했다.@PutMapping("/api/v1/fruit") public void recordFruit(@RequestBody FruitSoldRequest request) { String readSql = "SELECT * FROM fruit WHERE id = ?"; boolean isFruitNoException = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); if (isFruitNoException) { throw new IllegalArgumentException(); } String sql = "UPDATE fruit SET sold = 1 WHERE id = ?"; jdbcTemplate.update(sql, request.getId()); }FruitController의 PUT API여기서 FruitSoldRequest는 id만을 가진 클래스이다.실행 결과문제 3.@GetMapping("/api/v1/fruit/stat") public FruitResponse getPrice(@RequestParam String name){ String readSql = "SELECT * FROM fruit WHERE name = ?"; boolean isFruitNoException = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); if (isFruitNoException) { throw new IllegalArgumentException(); } String sql = "SELECT sum(price) FROM fruit WHERE name = ? GROUP BY sold"; List priceSum = jdbcTemplate.query(sql, (rs, rowNum) -> { long sum = rs.getLong("sum(price)"); return sum; }, name); return new FruitResponse(priceSum.get(0),priceSum.get(1)); }Sum과 Group by를 포함한 클래스 실행 결과
![[인프런 워밍업 클럽] BE 0기 과제 #3익명클래스와 람다식](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 21.
0
[인프런 워밍업 클럽] BE 0기 과제 #3익명클래스와 람다식
자바의 람다식은 왜 등장했을까?람다식이 등장하게 된 이유 1. 익명 클래스를 사용한다고 해도 코드의 길이나 가독성 면에서 효율이 떨어진다. 람다식을 사용하게 되면 코드를 간결하고 가독성이 높도록 짤 수 있다. 2. 함수형 프로그래밍의 사용에서 람다식은 핵심 요소이다. 람다식을 통하여 함수를 변수에 할당하거나 인자로 사용하는 등 함수를 객체로 다룰 수 있게 해준다. 또 익명 함수를 생성하여 코드의 간결성은 물론, 함수를 직접적으로 정의하고 사용할 수 있게 해준다. 이를 통하여 함수형 프로그램으로 고차 함수 같은 개념을 적용하기 쉬워진다. 또한 람다식은 코드를 더욱 선언적으로 만들어준다. 3. How(어떻게)보다 What(무엇을)에 집중할 수 있도록 도와준다. 예를 들어, SQL에서 어떻게 데이터를 찾을 건인가에 집중하지 않고, 어떤 데이터를 찾을 지에 대해 집중하도록 만들어주기 때문에 가독성 향상과 버그 발생 확률을 줄여줄 수 있다.람다식과 익명클래스는 어떤 관계가 있을까?자바의 익명 클래스를 쓰는 이유 자바에서 익명 클래스를 쓰는 이유는 프로그램 내에서 한번만 객체로 사용되는 클래스의 경우 클래스를 정의하고 생성하는 것이 비효율적이기 때문에 익명 클래스를 이용하여 정의와 구현을 동시에 할 수 있다.람다식과 익명클래스의 관계 람다식과 익명클래스는 둘 다 이름 없는 함수를 정의할 수 있는 방법이다. 람다식과 익명클래스 둘 다 정의와 동시에 실행할 수 있으며. 함수형 인터페이스 구현에 쓰인다는 점이 공통점이다. 하지만 @FunctionalInterface에서와 같이Runnable r = new Runnable() { @Override public void run() { System.out.println("Hello, world!"); } }; 위와 같은 익명클래스를Runnable r = () -> System.out.println("Hello, world!"); 간단하게 나타낼 수 있도록 한다. 스트림 API는 데이터의 흐름을 처리하는 기능으로, 함수형 프로그래밍의 스타일로 데이터를 처리할 수 있도록 해준다. 람다식을 활용하여 데이터의 흐름을 조작하는 연산을 정의할 수 있도록 해준다.메소드 레퍼런스는 특정 메소드를 직접 참조하는 기능으로, 람다식을 더 간결하게 표현할 수 있도록 해준다. 람다식이 함수형 인터페이스의 추상 메소드를 구현하는 방법이라면, 메소드 레퍼런스는 이미 구현된 특정 메소드를 바로 참조하여 그 메소드의 동작을 사용하는 방법이다.람다식 문법 (parameter) -> { Body } 람다식은 위의 문법처럼 사용할 수 있다. parameter에는 람다식이 받는 인자를 나열한다. 괄호 안에 인자를 쉼표로 구분하여 나열한다. 인자의 타입은 컴파일러가 자동으로 추론하기 때문에 생략할 수 있다. ->는 람다식의 부호로 왼쪽이 인자, 오른쪽이 본문부분임을 나타낸다. Body에는 람다식의 본문을 작성한다.(a, b) -> a + b 람다식을 이용하여 두 정수를 더하는 함수를 만들 수 있다.
![[인프런 워밍업 클럽] BE 0기 과제 #2 API생성](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 20.
0
[인프런 워밍업 클럽] BE 0기 과제 #2 API생성
문제 1.package com.group.libraryapp.dto.assignment2.request; public class Assignment2Request { private int number1; private int number2; public Assignment2Request(int number1, int number2) { this.number1 = number1; this.number2 = number2; } public int getadd() { return number1 + number2; } public int getminus() { return number1 - number2; } public int getmultiply() { return number1 * number2; } }Request부분 코드@RestController public class Assignment2Controller { @GetMapping("/api/v1/calc") public Assignment2Request calc(Assignment2Request request){ return request; }Controller부분 코드실행 결과 강의에서 배웠던 API 생성과도 비슷한 문제였다. return값을 객체로 하여 JSON형식으로 반환값이 나올 수 있도록 해주었다.문제 2.package com.group.libraryapp.dto.assignment2.request; import java.time.DayOfWeek; import java.time.LocalDate; public class Assignment2DayRequest { private LocalDate date; private DayOfWeek dayOfTheWeek; public Assignment2DayRequest(String date) { this.date = LocalDate.parse(date); this.dayOfTheWeek = this.date.getDayOfWeek(); } public DayOfWeek getdayOfTheWeek() { return dayOfTheWeek; } }Request부분 코드 @GetMapping("/api/v1/day") public Assignment2DayRequest findDay(Assignment2DayRequest request2) { return request2; }Controller부분 코드실행 결과 날짜를 입력받기 위해 자바의 LocalDate 클래스에 대해 알아보고 요일을 출력하기 위해 DayOfWeek 클래스에 대해서도 찾아 보았다. 입력받는 날짜가 LocalDate의 toString 포맷과 같아 parse를 이용하여 객체에 넣어주었고, DayOfWeek의 객체를 이용해 요일을 받았다. getter를 가진 객체를 이용해 문제1과 마찬가지로 JSON형태로 반환하도록 했다.문제 3.package com.group.libraryapp.dto.assignment2.request; import java.util.ArrayList; import java.util.List; public class Assignment2AddRequest { private final List numbers = new ArrayList(); public List getNumbers() { return numbers; } }Request부분 코드 @PostMapping("/api/v1/add") public int addAllNumbers(@RequestBody Assignment2AddRequest request) { List numbers = request.getNumbers(); int sum = 0; for (Integer number : numbers) { sum += number; } return sum; }Controller부분 코드실행 결과 생각했던 것에 비해 시간이 많이 걸린 문제였다. @RequsetBody를 사용하여 바디로 정보를 받는 경우에 파라미터를 가진 생성자가 있는 객체가 존재한다면 에러가 생긴다는 사실을 모르고 있었다. 에러가 나서 코드의 오류를 분석하면서 여러 정보들을 찾은 결과 Body로 들어오는 JSON을 주어진 객체로 변환하는 과정에서 오류가 생긴다고 찾아냈고, 생성자를 지웠다. 또한 문제 3번에서는 상관이 없지만, final을 사용하여 요청이 처리된 후에는 객체가 바뀌지 않도록 해주어 코드의 안정성을 높였다.
![[인프런 워밍업 클럽] BE 0기 과제 #1 어노테이션](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 19.
0
[인프런 워밍업 클럽] BE 0기 과제 #1 어노테이션
5강까지의 강의를 수강하면서 서버 개발에 필요한 개념을 배우며 시작했다. 서버에 관해서 다양한 기본 개념이 있었다. 그리고 개발을 시작하면서 어노테이션에 대해 언급이 시작되었고, 코딩을 하기에 어노테이션에 대한 개념이 확실하게 잡혀 있다면 도움이 될 것 같았다. 과제로 어노테이션에 대해 정리를 한다.• 어노테이션이란?• 자바에서 어노테이션이란 코드에 메타데이터 즉, 코드의 정보를 설명하는 데이터를 추가하는 방법을 제공하는 것이다. 어노테이션은@ 기호를 사용하여 표시되며, 주로 클래스, 메서드, 필드 등의 선언 부분에 적용된다. 어노테이션은 미리 정의된 내장 어노테이션을 사용할 수도 있고, 직접 어노테이션을 정의하여 사용할 수도 있다.1. 어노테이션을 사용하는 이유(효과)는 무엇일까?• 코드의 가독성 향상어노테이션을 사용하게 되면 메타데이터를 코드에 직접 넣어 코드의 목적과 동작을 이해하기 쉬워진다.• 코드의 유지,보수 용이코드의 메타데이터를 코드에 포함시키게 되면 해당 코드의 변경이나 유지보수가 용이해진다.• 프레임워크와의 협업어노테이션은 프레임워크와 함께 작동될 때, 더 큰 효과를 발휘하게 된다. 강의에서 사용한 @Controller등의 어노테이션을 이용하여 객체의 역할을 나타내고, 프레임워크가 해당객체를 적절히 관리할 수 있도록 한다.2. 나만의 어노테이션은 어떻게 만들 수 있을까?• 나만의 어노테이션은 ‘@interface'라는 키워드의 사용으로 나만의 어노테이션을 정의할 수 있다.public @interface MyAnnotation { ~ }• 메타 어노테이션 활용: 어노테이션의 동작 방식을 정의하기 위해 메타 어노테이션을 사용합니다. 가장 대표적인 메타 어노테이션은 @Target, @Retention, @Documented, @Inherited 등이 있습니다. @Target: 어노테이션이 적용될 수 있는 대상을 지정한다. 예를 들어, METHOD, TYPE, FIELD 등이 있다. @Retention: 어노테이션의 정보가 언제까지 유지될지를 지정한다. SOURCE, CLASS, RUNTIME 중 하나를 선택할 수 있다. @Documented: 어노테이션 정보를 Javadoc에 포함시킬지를 결정한다. @Inherited: 어노테이션을 하위 클래스에게 상속시킬지를 결정한다.• 어노테이션 내부에는 멤버를 선언할 수 있다. 이 멤버들은 메소드 형식으로 선언되고, 파라미터를 가질 수 없다. 또한, 반환 값으로는 기본 데이터 타입, String, Class, enum, 그리고 이들의 배열만 허용된다.




