역직렬화
수강평 작성수
-
평균평점
-
블로그
전체 7![[인프런 워밍업 스터디1기] 7일차 진도표](https://cdn.inflearn.com/public/files/blogs/098b6ece-958e-4c66-89e0-cc381eb8631e/333476.png?w=260)
2024. 05. 16.
0
[인프런 워밍업 스터디1기] 7일차 진도표
public class FruitService { private final FruitRepository fruitRepository; public FruitService(FruitRepository fruitRepository) { this.fruitRepository = fruitRepository; } @Transactional public void storeFruit(String name, LocalDate warehousingDate, long price) { Fruit fruit = fruitRepository.save(new Fruit(name, warehousingDate, price)); } @Transactional public void sellFruit(long fruitId) { Fruit fruit = fruitRepository.findById(fruitId) .orElseThrow(IllegalArgumentException::new); fruit.updateSold(); } @Transactional(readOnly = true) public FruitStatResponse getFruitStat(String name) { FruitStatResponse response = new FruitStatResponse(); List soldFruits= fruitRepository.findAllByNameAndSold(name, (byte)1); List notSoldFruits= fruitRepository.findAllByNameAndSold(name, (byte)0); response.setSalesAmount(soldFruits.stream().map(fruit -> fruit.getPrice()).reduce(new Long(0), (a, b) -> (a+b))); response.setNotSalesAmount(notSoldFruits.stream().map(fruit -> fruit.getPrice()).reduce(new Long(0), (a, b) -> (a+b))); return response; } ... }package com.group.libraryapp.dto.fruit.response; public class FruitCountResponse { private final long count; public FruitCountResponse(long count) { this.count = count; } public long getCount() { return count; } } controller @GetMapping("/api/v1/fruit/count") public FruitCountResponse countFruit (@RequestParam String name){ return fruitService.countFruit(name); } service@Transactional public FruitCountResponse countFruit (String name){ long countFruit = fruitJpaRepository.countByName(name); return new FruitCountResponse(countFruit); }
![[인프런 워밍업 스터디1기] 4일차 진도표](https://cdn.inflearn.com/public/files/blogs/3bdea973-8c7c-45aa-bcfa-6eb7472a8aba/333476.png?w=260)
2024. 05. 09.
0
[인프런 워밍업 스터디1기] 4일차 진도표
public class Main { pulbic static void main(String[] args) throws Exception { System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0; for(int i = 0; i = 0 && b = 1 && b = 2 && b = 3 && b = 4 && b = 5 && b 클린코드 만들기 주사위 시뮬레이션 만들기import java.util.Scanner; public class Main { public static void main(String[] args) { System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int[] results = new int[6]; for (int i = 0; i
![[인프런 워밍업 스터디1기] 4일차 진도표](https://cdn.inflearn.com/public/files/blogs/0d32e902-e24f-4f61-a14f-f6c98e8b26a0/333476.png?w=260)
2024. 05. 07.
0
[인프런 워밍업 스터디1기] 4일차 진도표
과일가게 DTOpublic class fruitStoreRequest { private String name; private LocalDate warehousingDate; private long price; public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public long getPrice() { return price; } }컨트롤러 작성@PostMapping("/api/v1/fruit") public void fruitStore(@RequestBody fruitStoreRequest requset) { String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES(?,?,?)"; jdbcTemplate.update(sql, requset.getName(), requset.getWarehousingDate(), requset.getPrice()); } API에서 long을 사용한 이유는?과일 가격과 같이 큰 정수 값을 다루는 경우에는 long 데이터 타입을 사용하는 것이 좋습니다. 이를 통해 범위 초과, 오버플로, 정확성 문제 등을 방지할 수 있다.
![[발자국] 인프런 워밍업 스터디 클럽 1기 발자국 - 1주차](https://cdn.inflearn.com/public/files/blogs/60e61af9-5fd9-4ef0-8848-92197b23a2e2/333476.png?w=260)
2024. 05. 05.
0
[발자국] 인프런 워밍업 스터디 클럽 1기 발자국 - 1주차
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]> 생애처음 스프링부트로 API 짜기 도전하면서 자율스터디를 해본 나란 사람, 선택과 집중이 필요한시점이기에 더욱 의미있는 스터디!현재 회사에 프로젝트가 너무 고되기도 하고 강의를 들을 때 한번에 집중 할수 있는 시간이 부족하여 주차별로 드문드문 들은거 같아서 아쉬운 마음이 크지만 내가 성장할 수 있는 시간이 점차 느껴지는 것 같아서 1주차 발자국을 남깁니다. 개발자들 특유의 API 짰어요 라는 말을 나도 이제 드디어 할 수 있다니!덧셈 API 짜는것부터 너무 이해하기 쉽고 차근차근 알려주셔서 얼마나 도움이 됐는지 모른다. 내가 강의를 통해 얻고 배운 인사이트 요약드디어 본격적인 덧셈 API 짜기@Restcontroller 진입점@Getmapping api 지정Get 메소드 사용, path는 /add 로 지정서버를 동작시키고 클라이언트가 get으로 보내면 public int함수가 호출된다@RequsetParam 주어지는 쿼리를 함수 파라미터에 넣음같은이름의 쿼리값이 arg로 들어오게 됨1) HTTP 호출 - RequestParam 방식port가 8080이므로 포스트맨에 8080으로 테스트package com.group.libraryapp.controller.calculator; 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( @RequestParam int number1, @RequestParam int number2 ){ return number1 + number2; }해당 계산API 짠 자바를 저장하고 톰캣 port 8080을 적용한 URL를 요청보낸다정상 호출 확인 200 서버값1) HTTP 호출 - 객체를 받는 방식DTO를 작성해준다. 컨트롤러랑 동일한 디렉토리로 dto 아래 calculator > request를 만들어준다.package com.group.libraryapp.dto.calculator.request; public class CalculatorAddRequest { private final int number1; private final int number2; public CalculatorAddRequest(int number1, int number2) { this.number1 = number1; this.number2 = number2; } public int getNumber1() { return number1; } public int getNumber2() { return number2; } } requestparam을 사용할때의 controller*객체를 사용할때의 controller서버 재시작다시 http에 요청을 보내면 정상 200k를 확인할 수 있다.특히 강의 중간중간 좋습니다는 열심히 하게 되는 원동력이 되었으며 2) POST API 개발GET API에서 POST로 받기에 필요한 선지식이 JSON이다. body로 데이터를 받는 과정이 필요하다JSON이란객체표기법, 즉 무언가를 표현하기 위한 형식이다!{ "name":"푸바오", "age":3 }JSON 표기는 중괄호가 양끝에 있음속성은 각각 쉼표로 구분JAVA 비유 MAPJSON value에는 다른 JSON이 올수 있다.소감 및 각오자바의 기본지식이 부족해서 스프링부트개념을 내가 이해할 수 있을까? 고민하면서도 강의를 들으면서 그런 고민이 아예사라지게되었다. 위에도 적었듯이 JSON 뜻이나 곱셈API 를 만드는 방법 하나하나를 알려주시고 직접 실습하게 하여 내것으로 만들수 있는 기회까지 얻을 수 있게 되어 이번기회로 자바도 공부하면서 스프링부트API를 짜고 서버에 배포해보는 귀한 경험을 가지고 가려고한다, 반복적인 것이 제일 중요한것을 잊지말고 꾸준히 내것으로 만들자!
백엔드
・
발자국
![[인프런 워밍업 스터디1기] 3일차 진도표](https://cdn.inflearn.com/public/files/blogs/ca0ca446-29e0-420e-88a6-5ce85878fb1d/333476.png?w=260)
2024. 05. 04.
0
[인프런 워밍업 스터디1기] 3일차 진도표
1.자바의 람다식은 왜 등장했을까?람다식에 대해 꼭 알아야 할 JAVA8과 람다의 영어원문이다 https://www.oracle.com/technical-resources/articles/java/architect-lambdas-part1.htmlJava 8에는 이러한 코드 블록을 더 쉽게 작성할 수 있도록 설계된 몇 가지 새로운 언어 기능이 도입되었습니다. 핵심 기능은 람다 표현식 (구어적으로 클로저 (이유는 나중에 논의할 예정임) 이라고도 함 ) 또는 익명 메서드 입니다 .[해당오라클 원문 발췌]Lambda expressions. Funda-men-tally, a lambda expression is just a shorter way of writing an implementation of a method for later execution. Thus, while we used to define a Runnable as shown in Listing 2, which uses the anonymous inner class syntax and clearly suffers from a “vertical problem” 람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되는 계기가 되었다! 람다식 의미와 문법특징1. 메서드와 달리 이름이 없다.2. 메서드와 달리 특정 클래스에 종속되지 않지만, 매개변수, 반환 타입, 본체를 가지며, 심지어 예외도 처리할 수 있다.3. 메서드의 인수로 전달될 수도 있고 변수에 대입될 수 있다.4. 익명 구현 객체와 달리 메서드의 핵심 부분만 포함한다.람다식의 규칙선언부의 타입은 추론할 수 있으므로 타입을 생략해도 된다.매개변수가 하나 있다면 괄호를 생략해도 된다.실행문이 하나 있다면 중괄호와 세미콜론을 생략할 수 있다. 단, 실행문이 하나의 return문이면 return 키워드도 생략해야 한다.Arrays.sort(strs, new Comparator () { @Override public int compare(String o1, String o2) { return o1.compareTo(o2) * -1; } }); System.out.prinln(Arrays.toString(strs)); 람다식을 사용하여 간결한 코드로 작성한 예제Arrays.sort(strs, (o1, o2) -> {return o1.compareTo(o2) * -1 }); System.out.println(Arrays.toString(strs));너무 간단해진 람다식 사용으로 인한 코드의 간결성!즉, 함수를 값으로 전달하는데, 어딘가에 구현하지 않고 그냥 간단하게 구현해서 넘기고 싶으면 람다식을 이용람다식은 “함수 값”으로 평가되며, 한 번만 사용된다. 2.람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?위에 오라클 공식문서에도 나오지만 익명클래스의 긴코드를 람다식으로 간결하게 사용가능하며 여기서 함수형 인터페이스 개념도 알아두어야 한다!즉, 함수형 인터페이스의 특성으로 인해 익명클래스, 익명메소드의 뻔한 부분을 생략시킬 수 있게되고, 최종적으로 생략한 형태를 람다표현식이라고 부르게 되는 것이다. 함수형 인터페이스자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 어떤 클래스냐고 진위를 묻는다면 지금까지 람다식이 메서드와 동등한 것처럼 설명해왔지만, 사실 람다식은 익명 클래스의 객체와 동등하다. 참조변수가 있어야 객체의 메서드를 호출 할 수 있으니까 일단 이 익명 객체의 주소를 f라는 참조변수에 저장해 보자.타입 f = (int a, int b) -> a > b ? a : b; //참조 변수의 타입은 뭐로 해야할까?참조형이기 때문에 클래스 또는 인터페이스가 가능하다. 람다식과 동등한 메서드가 정의되어 있어야함그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출 예를 들어 아래와 같이 max()라는 메서드가 정의된 MyFunction 인터페이스가 정의되어 있다고 가정하자.interface MyFunction() { public abstract int max(int a, int b);그러면 이 인터페이스를 구현한 익명 클래스의 객체의 예MyFunction f = new MyFunction() { public int max(int a, int b) { return a > b ? a : b; } }; int big = f.max(5, 3); //익명 객체의 메서드를 호출가장 중요!결국 코드를 깔끔하게 작성하기 위해 함수형 인터페이스가 필요했고, 함수형 인터페이스의 특성으로 인해 익명클래스와 익명메소드의 뻔한 코드를 삭제하고 람다표현식으로 깔끔하게 표현
백엔드
・
백엔드
![[인프런 워밍업 스터디 1기] 2일차 진도표](https://cdn.inflearn.com/public/files/blogs/3247ad27-39e3-4048-9f67-4e7f69ed2ad7/333476.png?w=260)
2024. 04. 30.
0
[인프런 워밍업 스터디 1기] 2일차 진도표
문제 1 GET API 덧셈 package com.group.libraryapp.controller.calculator; 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( @RequestParam int number1, @RequestParam int number2 ){ return number1 + number2; } 뺄셈곱셈@PostMapping("/multiply") public int multiplyTwoNumber(@RequestBody CalculatorMultiRequest request) { return request.getNumber1 ()* request.getNumber2(); }
백엔드
![[인프런 워밍업 스터디 1기] 1일차 진도표](https://cdn.inflearn.com/public/files/blogs/5008fed7-554f-440f-9682-bc54d7366c40/333476.png?w=260)
2024. 04. 29.
0
[인프런 워밍업 스터디 1기] 1일차 진도표
어노테이션을 사용하는 이유 (효과) 는 무엇일까?어노테이션은 사전적 의미로 주석이라는 뜻을 가지고 있다. 자바에서 어노테이션은 소스 코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다. 메타 데이터란 애플리케이션이 처리해야 할 데이터가 아니라 컴파일 및 런타임 과정에서 코드를 어떻게 처리해야 할지 알려주기 위한 추가 정보이다. 자바 어노테이션은 JDK 1.5 버전 이상에서부터 사용가능하며, 자바 어노테이션은 클래스 파일에 임베드되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작한다. 어노테이션이 나오기 이전에는 XML 및 마커 인터페이스를 통해 추가적인 정보를 제공할 수 있었다. [ 어노테이션 장점 ]코드 가독성 : 어노테이션은 코드와 설정을 같은 위치에 배치하므로 읽고 이해하기 쉽다. 클래스, 메서드, 필드, 파라미터 등 연관된 코드와 가까이 있기 때문에 흐름을 따라가기 쉽다.설정의 간소화 : 별도의 설정 파일 작성 없이 어노테이션 적용을 통해 설정을 간소화할 수 있다.중복 코드 제거 : 공통적인 코드 패턴이나 설정을 재사용할 수 있기 때문에 코드의 중복을 줄이고 효율적으로 코드를 작성할 수 있다.커스텀 어노테이션 : 직접 커스텀 어노테이션을 정의함으로 필요한 기능이나 제약 사항을 정의하여 사용할 수 있다.프로세서를 통한 검증 및 코드 생성 : 어노테이션 프로세서를 이용해 컴파일 시점에 어노테이션을 처리하고 검증할 수 있다. 또한 코드를 자동으로 생성하거나 수정할 수 있기에 효과적으로 기능을 구현할 수 있다.나만의 어노테이션은 어떻게 만들 수 있을까?메타 어노테이션의 종류는 다음과 같다.@Retention : 컴파일러가 어노테이션을 다루는 방법을 기술, 어느 시점까지 영향을 미치는지를 결정RetentionPolicy.SOURCE : 컴파일 전까지만 유효RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM에 의해 참조가 가능(리플렉션)@Target : 어노테이션 적용할 위치 선택ElementType.PACKAGE : 패키지 선언ElementType.TYPE : 타입 선언ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언ElementType.CONSTRUCTOR : 생성자 선언ElementType.FIELD : 멤버 변수 선언ElementType.LOCAL_VARIABLE : 지역 변수 선언ElementType.METHOD : 메서드 선언ElementType.PARAMETER : 전달인자 선언ElementType.TYPE_PARAMETER : 전달인자 타입 선언ElementType.TYPE_USE : 타입 선언@Documented : 해당 어노테이션을 Javadoc에 포함시킴@Inherited : 어노테이션의 상속을 가능하게 함@Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함ㅁ사용자 정의 어노테이션 정의import java.lang.annotation.*; // 메타 어노테이션을 활용하여 사용자 정의 어노테이션 선언 @Target(ElementType.TYPE) // 어노테이션 적용 대상 Type으로 설정 @Retention(RetentionPolicy.RUNTIME) // 런타임 시까지 어노테이션을 사용 public @interface CustomAnnotation { int age() default 20; // default로 20 설정 String name(); } 출처: https://ittrue.tistory.com/158 [IT is True:티스토리]ㅁ사용자 정의 어노테이션 사용import java.lang.annotation.*; // 메타 어노테이션을 활용하여 사용자 정의 어노테이션 선언 @Target(ElementType.TYPE) // 어노테이션 적용 대상 Type으로 설정 @Retention(RetentionPolicy.RUNTIME) // 런타임 시까지 어노테이션을 사용 public @interface CustomAnnotation { int age() default 20; // default로 20 설정 String name(); } 출처: https://ittrue.tistory.com/158 [IT is True:티스토리]
백엔드
・
어노테이




