블로그
전체 9#카테고리
- 백엔드
#태그
- 인프런워밍업클럽
2024. 03. 10.
0
[인프런 워밍업 클럽_0기 BE] 마지막 발자국 남기기
🌱3주차 회고🌱 키워드 깃,깃허브배포(AWS)Spring Boot 칭찬하고 싶은 점 :모든 강의를 학습하고, 미니프로젝트를 1단계까지 마무리를 지을 수 있어서 다행이였다고 생각합니다. 아쉬운 점 :아직 미니프로젝트의 2,3,4 단계를 수행하기에는 능력이 많이 부족하다는 생각이 들었습니다.다른 일정도 병행하고 있어서 더욱 구현하기 어려웠다고 생각합니다.추후 꼭 개인적으로라도 2,3,4 단계를 구현해내고 싶습니다! 3주 정도의 짧다면 짧은 시간동안 자바, 스프링부트를 활용하여 서버를 만들어보는 경험을 한 것이굉장한 도움이 되었습니다. 사실 스터디를 참여하지 않았다면 완강이 어려웠을 수도 있지만,코치님과 멘토님 그리고 스터디원 분들에게 많은 동기부여를 받아 완강할 수 있었던 것 같습니다.정말 참여하기 잘했다는 생각이 들고, 다음에도 이런 좋은 기회가 있다면 다시 참여하고 싶습니다.지속적으로 개발 공부를 하면서 최태현 멘토님 같은 개발자가 될 수 있도록 노력하겠습니다 파이팅!
인프런워밍업클럽
2024. 03. 03.
0
[인프런 워밍업 클럽_0기 BE] 두번째 발자국 남기기
🌱2주차 회고🌱 키워드 스프링 컨테이너, 스프링 트랜잭션Spring Data JPA 칭찬하고 싶은 점 :한번도 학습하지 않은 부분이여서 조금은 낯설었지만 진도표에 알맞게 학습을 하고 미션를 수행하려고 노력했던 점을 칭찬하고 싶습니다. 아쉬운 점 :아직 완벽하게 습득을 못한 것 같아 스스로 아쉬움이 많이 남습니다.아무래도 학원과 병행을 하다 보니, 머릿속으로 정리가 안된 부분들이 많습니다.미니 프로젝트를 수행하면서 앞 부분의 내용들을 정리하는 시간이 필요할 것 같습니다. 미션 목록6일차 : (몸이 좋지 않아 수행하지 못함)7일차 : https://inf.run/JF2jk미션을 해결한 과정 :아무래도 1주차 미션들 보다 난이도 있게 느껴졌습니다. 최대한 강의를 학습하고 미션을 수행하기 위해 노력했으며다른 분들의 코드를 보고 '이렇게도 할 수 있구나!' 하며 스스로 생각을 많이 하게 되었습니다.
인프런워밍업클럽
2024. 02. 27.
0
[인프런 워밍업 클럽_0기 BE] 일곱번째 과제 - JPA
create table fruit ( id bigint auto_increment, name varchar(20), price bigint, warehousing_date date, is_sold boolean default false, reg_datetime datetime default CURRENT_TIMESTAMP, alt_datetime datetime, primary key (id)); ackage com.group.libarayapp.dto.task07.request; import java.time.LocalDate; public class FruitCreateRequestEx07 { Long id; String name; LocalDate warehousing; Long price; int salesQuantity; public FruitCreateRequestEx07(Long id, String name, LocalDate warehousing, Long price, int salesQuantity) { this.id = id; this.name = name; this.warehousing = warehousing; this.price = price; this.salesQuantity = salesQuantity; } public String getName() { return name; } public Long getId() { return id; } public LocalDate getWarehousing() { return warehousing; } public Long getPrice() { return price; } public int getSalesQuantity() { return salesQuantity; } }package inflearn; package com.group.libarayapp.controller.task07; import com.group.libarayapp.domain.user.task07.Fruit; import com.group.libarayapp.dto.task07.request.FruitCreateRequestEx07; import com.group.libarayapp.dto.task07.request.FruitRequestEx07; import com.group.libarayapp.dto.task07.response.FruitResponseEx07; import com.group.libarayapp.dto.task07.response.FruitSalesCountResponseEx07; import com.group.libarayapp.service.task07.FruitServiceEx07; import org.springframework.web.bind.annotation.*; import java.util.List; public class FruitControllerEx07 { @RestController public class FruitControllerEx07 { private final FruitServiceEx07 fruitServiceEx07; public FruitControllerEx07(FruitServiceEx07 fruitServiceEx07) { this.fruitServiceEx07 = fruitServiceEx07; } // 문제 1 @PostMapping("/api/v3/fruit") public void saveFruit(@RequestBody FruitRequestEx07 request) { fruitServiceEx07.saveFruit(request); } // 문제 2 @PutMapping("/api/v3/fruit") public void salesQuantityFruit(@RequestBody FruitCreateRequestEx07 request) { fruitServiceEx07.salesQuantityFruit(request); } // 문제 3 @GetMapping("/api/v3/fruit/stat") public FruitResponseEx07 SalesAmountFruit(@RequestParam String name) { return fruitServiceEx07.salesAmountFruit(name); } // 문제 3 @GetMapping("/api/v3/fruit/count") public FruitSalesCountResponseEx07 SalesCountFruit(@RequestParam String name) { return fruitServiceEx07.salesCountFruit(name); } @GetMapping("/api/v3/fruit/list") public List fruitListOfGTEorLTE( @RequestParam(name = "option") String option, @RequestParam(name = "price") long price) { return fruitServiceEx07.fruitListOfGTEorLTE(option, price); } } }package com.group.libarayapp.dto.task07.request; import java.time.LocalDate; public class FruitRequestEx07 { private Long id; private String name; private LocalDate warehousingDate; private int salesQuantity; private Long price; public FruitRequestEx07(String name, LocalDate warehousingDate, Long price) { this.name = name; this.warehousingDate = warehousingDate; this.price = price; } public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public Long getPrice() { return price; } public Long getId() { return id; } public int getSalesQuantity() { return salesQuantity; } } package com.group.libarayapp.dto.task07.response; public class FruitResponseEx07 { private final long salesAmount; private final long notSalesAmount; public FruitResponseEx07(long salesAmount, long notSalesAmount) { this.salesAmount = salesAmount; this.notSalesAmount = notSalesAmount; } public long getSalesAmount() { return salesAmount; } public long getNotSalesAmount() { return notSalesAmount; } }package com.group.libarayapp.dto.task07.response; public class FruitSalesCountResponseEx07 { private final long count; public FruitSalesCountResponseEx07(long count) { this.count = count; } public long getCount() { return count; } }
인프런워밍업클럽
2024. 02. 24.
0
[인프런 워밍업 클럽_0기 BE] 첫번째 발자국 남기기
🌱1주차 회고🌱 키워드 어노테이션람다식과 익명 클래스클린 코드 칭찬하고 싶은 점 :교육과 병행중임에도 진도표에 맞춰 강의를 빼놓지 않고 학습하였습니다.또한 미션 제출도 기간안에 모두 제출한 점을 칭찬하고 싶습니다. 아쉬운 점 :아직 API, DB 가 익숙하지 않아 이 부분에 대해서 더욱 심도있게 공부해야겠다는 생각을 했습니다. 아무래도 매일 강의를 학습하고 미션을 제출하는것에 초점을 두다 보니 복습을 소홀히 한 것 같은 생각이 들었습니다. 보완하고 싶은 점 :2주차 부터는 누적 공부를 통해 1주차에 배운 내용들을 복습하는 시간을 갖고자 합니다.또한 자바 공부를 같이 하며 기본기를 다시 다잡고자 합니다. 미션 목록 1일차 : https://inf.run/nZf9M2일차 : https://inf.run/JcMH53일차 : https://inf.run/1sdHd4일차 : https://inf.run/sbtjw5일차 : https://inf.run/Yv5uV 미션을 해결한 과정 :미션에서 요구하는 것이 무엇인지 1순위로 파악하고자 했습니다. 문제에 답이 있다! 라는 말처럼 우선 문제에 대해이해하고 파악하기 위해 노력했습니다. 미션 도중 막히게 되는 순간들이 있었는데, 이러한 순간이 오면 최대한 생각을하다가 책이나 강의를 통해 개념을 다시 보거나 검색을 통하여 해결을 하였습니다.
인프런워밍업클럽
2024. 02. 23.
0
[인프런 워밍업 클럽_0기 BE] 다섯번째 과제 - Clean Code
우리는 라는 개념을 배웠습니다. 에 대한 감각을 익히기 위해서는 어떤 코드가 좋은 코드이고, 어떤 코드가 좋지 않은 코드인지 이론적인 배경을 학습하는 것도 중요할 뿐 아니라, 다양한 코드를 읽어 보며 어떤 부분이 읽기 쉬웠는지, 어떤 부분이 읽기 어려웠는지, 읽기 어려운 부분은 어떻게 고치면 좋을지 경험해보는 과정이 필요합니다.이번 과제는 제시된 코드를 읽어보며, 코드를 더 좋은 코드로 고쳐나가는 과정입니다. 구글에 “클린 코드” 혹은 “클린 코드 정리”를 키워드로 검색해보면, 이론적인 배경을 충분히 찾아보실 수 있습니다. 🙂 그러한 내용들을 보며 제시된 코드를 더 좋은 코드로 바꿔보세요! (코드를 바꿀 때 왜 바뀐 코드가 더 좋은 코드인지 다른 사람에게 설명하신다고 생각해보시면 더욱 좋습니다.) [제시된 코드]여러 함수로 나누어도 좋습니다! 🙂여러 클래스로 나누어도 좋습니다! 🙂 *클린코드(Clean Code) 란 ? 좋은코드란 무엇일까이름만으로도 예측 가능한 코드객체 생성에 유의미한 이름서술적인 이름명령과 조회를 분리오류 코드보단 예외 package inflearn; import java.util.Scanner; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; public class DiceRollStatistics { private static final int NUMBER_OF_SIDES = 6; private static final int MAX_THREADS = Runtime.getRuntime().availableProcessors(); public static void main(String[] args) { try (Scanner scanner = new Scanner(System.in)) { System.out.print("주사위를 던질 횟수를 입력하세요: "); int numberOfThrows = scanner.nextInt(); int[] diceCounts = getDiceCounts(numberOfThrows); printStatistics(diceCounts); } } private static int[] getDiceCounts(int numberOfThrows) { AtomicInteger[] counts = new AtomicInteger[NUMBER_OF_SIDES]; IntStream.range(0, NUMBER_OF_SIDES) .forEach(i -> counts[i] = new AtomicInteger()); IntStream.range(0, numberOfThrows) .parallel() .limit(MAX_THREADS) .forEach(i -> { int result = ThreadLocalRandom.current().nextInt(NUMBER_OF_SIDES); counts[result].incrementAndGet(); }); return IntStream.range(0, NUMBER_OF_SIDES) .map(i -> counts[i].get()) .toArray(); } private static void printStatistics(int[] diceCounts) { IntStream.range(0, NUMBER_OF_SIDES) .forEach(i -> System.out.printf("주사위 눈 %d은(는) %d번 나왔습니다.\n", i + 1, diceCounts[i])); } }
백엔드
・
인프런워밍업클럽
2024. 02. 22.
0
[인프런 워밍업 클럽_0기 BE] 네번째 과제 - API 생
진도표 4일차와 연결됩니다우리는 GET API와 POST API를 만드는 방법을 배웠습니다. 👍 추가적인 API 들을 만들어 보며 API 개발에 익숙해져 봅시다!package day4homework; import java.time.LocalDate; public class FruitSave { private String name; private LocalDate warehousingDate; private long price; public FruitSave(String name, LocalDate warehousingDate , long price) { this.name=name; this.warehousingDate = warehousingDate; this.price = price; } public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public long getPrice() { return price; } }*한걸음 더 )int형을 사용했을 때 범위가 제한적이기 때문에, 범위가 더 넓은 long을 사용합니다.
백엔드
・
인프런워밍업클럽
2024. 02. 21.
0
[인프런 워밍업 클럽_0기 BE] 세번째 과제 - 람다식,익명클래스
우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊 람다식(Lambda Expresstion) (=익명 함수)Java 8에 도입함수(메서드)를 간단한 '식' 으로 표현하는 방법 *함수와 메서드의 차이?근본적으로 동일하지만 함수는 일반적 용어인 반면 메서드는 객체지향개념 용어 람다식 작성하기(parameter) -> expression메서드의 이름과 반환타입을 제거하고 '->' 를 블록{} 앞에 추가함반환값이 있는 경우, 식 또는 값만 작성하고 return 문 생략 가능(끝에 ';' 붙이지 않음)매개변수의 타입이 추론 가능하면 생략가능 람다식의 장점더 적은 코드로 동일한 내용을 구현할 수 있다코드를 간결하게 하고 가독성을 향상 시킬 수 있다생산성이 높아진다병렬 프로그래밍에 용이하다 iii. 익명 클래스를 사용하는 이유익명 클래스는 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체일시적으로 사용 -> 추후 재사용 불가능 참고 출처ttps://hyeju-it.tistory.com/134JAVA의 정석(기초편)
백엔드
・
인프런워밍업클럽
2024. 02. 20.
0
[인프런 워밍업 클럽_0기 BE] 두번째 과제 - API
우리는 GET API와 POST API를 만드는 방법을 배웠습니다. 👍추가적인 API 들을 만들어 보며 API 개발에 익숙해져 봅시다!문제 풀이)package com.group.libarayapp.controller.task; import com.group.libarayapp.dto.task.request.Ex01Request; import com.group.libarayapp.dto.task.response.Ex01Response; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class Ex01Controller { @GetMapping("/api/v1/calc") public Ex01Response firstEx(Ex01Request request) { return new Ex01Response(request); } }package com.group.libarayapp.dto.task.request; public class Ex01Request { private final int num1; private final int num2; public Ex01Request(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public int getNum1() { return num1; } public int getNum2() { return num2; } }package com.group.libarayapp.dto.task.response; import com.group.libarayapp.dto.task.request.Ex01Request; public class Ex01Response { private final int add; private final int minus; private final int multiply; public Ex01Response(Ex01Request ex01Request) { this.add = ex01Request.getNum1() + ex01Request.getNum2(); this.minus = ex01Request.getNum1() - ex01Request.getNum2(); this.multiply = ex01Request.getNum1() * ex01Request.getNum2(); } public int getAdd() { return add; } public int getMinus() { return minus; } public int getMultiply() { return multiply; } } package com.group.libarayapp.controller.task; import com.group.libarayapp.dto.task.request.Ex02Request; import com.group.libarayapp.dto.task.response.Ex02Response; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class Ex02Controller { @GetMapping("/api/v1/day-of-the-week") public Ex02Response secondEx(Ex02Request request) { return new Ex02Response(request); } }package com.group.libarayapp.dto.task.request; import java.time.LocalDate; public class Ex02Request { private final LocalDate date; public Ex02Request(LocalDate date) { this.date = date; } public LocalDate getDate() { return date; } }package com.group.libarayapp.dto.task.response; import com.group.libarayapp.dto.task.request.Ex02Request; import java.time.format.TextStyle; import java.util.Locale; public class Ex02Response { private final String dayOfTheWeek; public Ex02Response(Ex02Request request) { this.dayOfTheWeek = request.getDate().getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US).toUpperCase(); } public String getDayOfTheWeek() { return dayOfTheWeek; } } *LocalDate : 로컬 시간 클래스로 시간 정보가 필요할 때 사용// 로컬 컴퓨터의 현재 시간 정보를 저장한 LocalDate 객체를 리턴.LocalTime currentTime = LocalTime.now(); // 파라미터로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴.LocalTime targetTime = LocalTime.of(12,33,35,22); package com.group.libarayapp.controller.task; import com.group.libarayapp.dto.task.request.Ex03Request; import com.group.libarayapp.dto.task.response.Ex03Response; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class Ex03Controller { @PostMapping("/api/v1/numbers-sum") public int thirdEx(@RequestBody Ex03Request request) { Ex03Response result = new Ex03Response(request.getNumbers()); return result.getSum(); } } package com.group.libarayapp.dto.task.request; import java.util.ArrayList; import java.util.List; public class Ex03Request { private final List numbers = new ArrayList(); public List getNumbers() { return numbers; } }package com.group.libarayapp.dto.task.response; import java.util.List; public class Ex03Response { private int sum; public Ex03Response(List numbers) { for (int number : numbers) { sum += number; } } public int getSum() { return sum; } }참고 출처 : https://java119.tistory.com/52
백엔드
・
인프런워밍업클럽
2024. 02. 19.
0
[인프런 워밍업 클럽_0기 BE] 첫번째 과제 - Annotation
우리는 최초로 API를 만들어 보았습니다. GET API를 만들기 위해 사용했던 어노테이션에 익숙하지 않다면 자바 어노테이션에 대해서 몇 가지 블로그 글을 찾아보세요! 다음 질문을 생각하며 공부해보면 좋습니다! 😊어노테이션을 사용하는 이유 (효과) 는 무엇일까?나만의 어노테이션은 어떻게 만들 수 있을까? 1. 어노테이션(Annotation) 을 사용하는 이유(효과) 는 무엇일까?어노테이션은 다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석 과 같은 의미를 가진다.어노테이션은 @을 사용하여 작성하며 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다. 스프링에서 어노테이션을 사용하면 코드량이 감소하고 유지보수하기 쉬우며 생산성이 증가된다. 어노테이션의 종류표준 어노테이션 - 자바에서 기본적으로 제공하는 어노테이션(@Override, @FunctionalInterface 등)메타 어노테이션 - 어노테이션으로 어노테이션을 정의하는 데 사용(@Target, @Documented, @Retention 등)사용자 정의 어노테이션 - 사용자가 직접 정의하여 사용하는 어노테이션 2. 나만의 어노테이션은 어떻게 만들 수 있을까?다음은 메타 어노테이션의 예제이다.어노테이션은 인터페이스 앞에 @를 붙여서 생성할 수 있다.package inflearn; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) // 2개의 String 값을 받을 수 있는 간단한 커스텀 어노테이션 public @interface MyAnnotation { String name(); String value(); } package inflearn; @MyAnnotation(name="someName", value = "Hello world") public class TheClass{ }
인프런워밍업클럽