블로그

Dayoming

인프런 워밍업 클럽 백엔드 스터디 2기 | 1주차 발자국🐾

 박우빈 님의 Readable Code: 읽기 좋은 코드를 작성하는 사고법 을 듣고 작성한 게시글입니다.  강의 수강 내용 요약강의에서 사용되는 용어들🔑도메인(domain)- 해결하고자 하는 문제 영역- ex) 결제 도메인, 주문 도메인, 상품 도메인...🔑 도메인 지식- 도메인을 이해하고 해결하는 데 필요한 지식부끄러운 이야기지만 도메인(domain) 이라는 이야기를 많이 들어보긴 했어도 도메인의 정의에 대해서는 따로 생각해보지 않았던 것 같다. 강의에 시작하기 앞서 사용되는 용어들에 대해 정리해 보면서 프로그래밍은 문제(=도메인)를 해결하기 위한 도구라는 생각을 다시 한 번 상기한 상태로 본 강의를 수강할 수 있었다. 추상 (抽象)사물을 정확하게 이해하기 위해서 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것, 어떤 일면만을 추상하는 것은 다른 측면을 버린다는 것과 같다.'깨끗한 코드를 쓰는 것'은 많은 개발자들의 로망이자 지켜야 할 규칙으로 자리잡고 있다. 그렇지만 우리에게 중요한 건 단순히 규칙을 지키는 것이 아니다. 개발자는 프로그램을 만드는 순간 순간 최적의 선택을 해야 하기 때문에 '왜 그런 규칙이 생겨났는가' 가 중요하다. 어떤 경우에는 규칙을 깨야 하는 경우도 존재한다. 그 편이 소프트웨어와 소프트웨어를 사용하는 사람들에게 더 좋다고 판단된다면!지식 공유자님이 말씀하시는 클린 코드가 중요한 이유는 가독성이다. 글이 잘 읽힌다는 것은 이해가 잘 된다는 뜻이고, 유지보수 하기가 수월해지므로 우리의 시간과 자원을 절약하게 해준다. 클린 코드라 지칭하는 수많은 원칙이나 조언은 이를 위해서라고 한다. 레거시 코드를 읽을 미래의 나나 다른 개발자가 코드를 빠르게 이해할 수 있는 코드를 짜두면 장기적으로 더 나은 생산성을 보이게 된다.이런 가독성을 위해서 중요하게 여겨지는 개념이 추상(抽象)이다. 무언가를 추상화한다는 것이 어렵게 다가오겠지만, 우리 뇌는 일상적으로 이 일을 수행하고 있다. 예를 들면 '차를 마신다'는 것도 다음과 같은 행위의 추상이다.1. 물을 끓인다. 2. 끓인 물을 컵에 붓는다. 3. 끓인 물이 들어있는 컵에 티백을 넣는다. 4. 찻물을 2~3분 정도 우린 후 마신다.컴퓨터 과학에서의 대표적인 예는 자료형(Type)이다. 1byte는 8bit를 묶은 것이고, char은 1byte로 문자 1개를 의미한다. 즉, 데이터(=bit) 덩어리를 어떻게 읽을 것인지에 대한 추상이다. 이렇게 적절한 추상화는 복잡한 데이터와 복잡한 로직을 단순화하여 이해하기 쉽도록 돕는다.적절한 추상화는 구체를 유추할 수 있게 한다. 누군가 '차를 마셨다' 라고 하면 물을 끓여 찻잎을 우리는 모습을 쉽게 상상할 수 있다. 그러나 잘못된 추상화가 야기하는 사이드 이펙트 또한 크다. 추상으로부터 구체를 유추하지 못한다면 잘못된 추상화이다. 이런 경우가 발생하는 이유는 다음과 같다.추상화 과정에서 중요한 정보를 부각시키지 못했다.해석자가 동일하게 공유하는 문맥이 없다.예를 들어 우리 집에서는 '밥 먹기' 를 '냠냠이 먹기' 라고 한다고 가정하자.회사 동료에게 '저는 어제 8시에 냠냠이 먹었어요.' 라고 한다면..아마도 갑자기 왜 귀여운 척을 하지? 라고 생각하지 않을까?이런 상황을 방지하기 위해서는 중요한 정보만 남도록 잘 덜어내어 추상화 하고, 적절한 이름을 짓는 것이 필요하다.어떻게 보면 '냠냠' 이라는 건 '먹는다' 는 구체를 떠올릴 수 있게 해주니, 아주 틀린 추상은 아닐지도 모르겠다. 이상한 사람 취급을 받을 수는 있겠지만 메서드와 추상화 레벨이름을 짓는 것과 더불어 인상깊었던 부분은 메서드와 추상화 레벨에 관한 부분이었다.'메서드명 뿐만 아니라 메서드 선언부 전체가 유기적으로 관여해서 의미를 전달한다' 는 것! 프로그램을 짤 때 메서드명은 최대한 메서드의 행동이 잘 드러나도록 작성하려고 하는 편인데, 파라미터나 반환타입까지 고려해야 한다는 생각은 해본 적이 없었다.회고를 하면서, 최근 넷플릭스에서 본 흑백요리사가 떠올랐다.출처: 넷플릭스안성재 셰프는 '요리를 만든 사람의 의도가 전해지는 것' 을 가장 중시한다. 요리에 쓸모없는 데코레이션을 올리는 것 보다 각 음식의 재료들이 자신의 역할을 다하길 바란다. 프로그램을 짜는 것도 다르지 않다는 생각이 들었다. 파라미터, 반환타입, 메서드명이라는 재료를 가지고, 누구나 이 메서드가 의도한 바를 명확히 알 수 있도록 하는 것. 모든 메서드를 이런 마음가짐으로 설계한다면 프로그래머계의 미슐랭 3스타를 받을 수 있지 않을까? 논리, 사고의 흐름뇌 메모리를 적게 쓰는 방법에 대해 알게 되어 좋았다.전에 클린 코드나 객체지향 생활체조 원칙에 대해 읽으면서 크게 와닿지 않았는데 직접 코드를 읽어보고, 고쳐보고, 고친 코드를 읽어보는 과정을 반복하니 이해할 수 있었다. if ~ else if ~ else문으로 코드를 짜는 게 본인 입장에서는 확실히 직관적이고 편하지만.. 겪어야 할 고통을 미래로 미뤄두는 것 뿐이다. 심지어 그 고통은 복리로 돌아온다. return 할수 있는 부분은 빨리 return 하고, 메서드로 쪼갤 수 있는 부분은 쪼개자! 물론 어떤 것이 효율적일지에 대한 적절한 판단이 필요하다.예외에 관한 부분도 좋았다. 프로그램을 짜다 보면 대부분 '대충 이렇게 잘 흘러가겠지?' 라고(해피케이스) 생각하게 되기 쉽다. 그러나 우리는 항상 방심하지 말고 예외가 발생하는 상황을 염두에 두어야 한다. 그냥 처음부터 '아마 생각한대로 흘러가진 않겠지만 이렇게 되긴 해야 돼..' 라고 생각하는 게 나을지도 모르겠다. 의도한 예외와 의도하지 않은 예외를 잘 구분해서 예상치 못한 상황이 발생하더라도 대참사만은 막을 수 있도록 안전한 프로그램을 설계하는 연습을 해야겠다. 객체 지향 패러다임과 SOLIDSOLID.. 정보처리기사 공부 했던 때가 주마등처럼 스쳐지나갔다. 뭔지도 모르고 달달 외웠었는데..코드를 직접 수정하며 각각 원칙을 적용해보는게 재미있었다. 다만 따라하면서 만약 내가 프로그램을 설계한다면 이 원칙들을 다 지키도록 설계할 수 있을까? 하는 생각이 들었다. 조금만 프로그램 규모가 커져도 지금보다 훨씬 복잡해질 것 같다😥 확실히 읽기에 편한 만큼 쓰는 사람이 고생해야 한다.. 그만큼 더 많이 복습하고, 더 많은 코드들을 봐야겠다고 다짐했다. 미션 수행 요약DAY2 - 추상과 구체의 예시 들기추상과 구체의 예시를 생각하는 것은 그리 어렵지 않았다. 그렇지만 '일상 생활에서 이렇게 많은 추상화가 이루어지고 있었구나' 하는 생각이 들어 신기했다. 추상이라는게 되게.. 어려운 말이라고 생각했는데 그냥 필요한 부분만 뽑아내는 것이라는게 체감됐다.책을 읽는 행위를 구체화 한다면? 1. 책을 손에 쥐거나 디지털 장치에서 페이지를 연다. 2. 눈으로 글자를 추적한다. 3. 글자를 인식하는 즉시 문장과 단어들이 뇌에서 의미로 변환된다. 4. 글 속의 아이디어와 자신의 가치관을 비교하고 의미를 추측해 자신의 해석을 만들어 낸다.다른 분이 하신 과제도 간간히 구경했는데, 특히 기억에 남는 과제가 있었다. 추상: 아침엔 네 다리로 걷고, 점심엔 두 다리로 걷고, 저녁엔 세 다리로 걷는다. 구체: 인간 ... 진짜 생각지도 못했다. 이런 수수께끼들도 사실 추상이었다👏🏻👏🏻 DAY4 - 코드 리팩토링, SOLID 요약🛠 리팩토링 전public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }🛠 리팩토링 후public class ValidateException extends IllegalArgumentException { public ValidateException(String message) { super(message); } }public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { throw new ValidateException("주문 항목이 없습니다."); } if (order.getTotalPrice() < 0) { throw new ValidateException("올바르지 않은 총 가격입니다."); } if (order.hasNotCustomerInfo()) { throw new ValidateException("사용자 정보가 없습니다."); } return true; }지금까지 배운 내용을 토대로 리팩토링을 진행했는데 너무너무 재밌었다. 이게 천직인가 싶을 정도로.. 예전에 현업에 있을 때도 그랬는데 구현보다 레거시 코드 뜯어 고치는게 더 재밌는거 정상이죠?확실히 강의를 들으며 공부하는 것과 실제로 배운 걸 적용해보는건 다르다. 앞으로 더 많이 뜯고, 읽고, 쓰면서 욕도 먹어보고 해야겠다. 갈길이 멀다.KPTKeep: 앞으로 지속하고 싶은 부분회고회고를 작성하면서 기록했던 부분을 다시 돌아보니 당시에 들었던 강의 내용이 생생하게 기억나서 좋았다. 사실 개발 외적으로도 주간 회고, 월간 회고, 이런 저런 회고 방법을 시도했었지만 딱히 와닿지 않았다. 그런데 이번에 1주차 발자국을 작성하면서 공부했던 내용을 돌아보게 되고 내가 알게된 것들과 몰랐던 것들에 대한 경계선이 뚜렷해지는 느낌을 받았다. 우빈 님 추천으로 KPT 방식도 알게 되고.. 4주차 회고를 진행할 땐 회고의 달인이 된 내 모습까지 기대해보며👶🏻커뮤니티 활동낯을 많이 가리는 나지만.. 나름 열심히 커뮤니티 활동에 참여하려고 노력하고 있다. 뭔가 아는 척 하는 것 같아 보일까 보내고 난 직후에도 삭제할까 말까, 괜히 보냈나 백 번 고민했다😥 그래도 인프런 워밍업 클럽이 제공하는 가장 큰 혜택이 이 커뮤니티 아닐까 싶다. 실제로 다른 분들이 이야기 하는 걸 구경하기만 해도 지식이 느는 기분이다. 직접 참여할 때는 두말 할 것 없이 성장한다. 위 대화만 해도 JVM과 스레드에 대해 다시 한 번 정리해볼 수 있는 시간이었다. 늘 커뮤니티에 상주하고 계신 몇몇 분들 덕분에 자극도 많이 받는다👍🏻Problem: 아쉬웠던 점기록나는 강의를 들으면서 거의 모든 내용을 기록해둔다. 당시에 생각나는 것, 듣고 있는 내용... 쓰다보면 사실 회의감이 들 때도 있다. 시간이 거의 두 세배는 넘게 걸리니 비효율적이지 않은가? 하는 생각이 들고 있었다. 시간이 오래 걸리니 강의를 틀기까지 꽤 큰 결심이 필요한데 필기 방식을 바꿔야하나 고민 중이다.일정이번에 진도표에 적힌 진도를 모두 따라가지 못했다. 다음 주에는 이번 주에 밀린 진도까지 꼭 학습해야겠다.Try: Problem을 해결하기 위해 시도해볼 점인프런의 강의 노트 기능을 이용해보는건 어떨까?일정은.. 그냥 열심히 하는 수밖에 없다. 이번엔 꼭 주말 전까지 2주차 진도를 끝내 놓을 것🔥🔥🔥

백엔드클린코드백엔드워밍업클럽JAVA

kimusvita

Readable Code (1) : 읽기 좋은 코드를 작성하는 사고법 (Day2)

추상강사님이 최대한 더럽고 시간 복잡도가 높은 최악의 코드를 골라오셨고, 우리는 이번 시간을 통해 이 코드를 읽기 좋은 코드로 거듭나기 위한 순서를 따라갔다. 1. 직관적으로 변수이름을 바꾸기를 실행하자.예를 들어, for loop에서 단순히 i, j로 두던 것을 row, col로 바꾸는 등의 refactoring을 진행했다.Refactoring Variable# for (int i = 0; i < 8; i++) { # for (int j = 0; j < 10; j++) { # board[i][j] = "□"; # } # } //수정 사항: 변수 이름 직관적으로 짓기 for (int row = 0; row < 8; row++) { for (int col = 0; col < 10; col++) { board[row][col] = "□"; } }   2. 잘 쓰여진 메서드는 주제가 하나다.한 가지를 실행하는데 집중한다. 코드를 읽고 이 메서드가 하는 일이 여러 개라면 작은 메서드로 나누는 게 좋다.기본적이지만 처음엔 어려웠던 부분인데 다시 짚고 넘어가봐서 좋았다. 3. 메서드 선언부- void 대신 충분히 반환할 값이 있는지 고민해보는 습관을 가지자. 반환값이 있다면 테스트도 용이해진다. 물론 void가 더 깔끔한 순간도 많으나, 한번쯤 고민해보자.- 구체화된 타입을 반환받는다.- 의미가 명확한 변수 이름을 사용한다._사용하는 입장에서도 더 편하게 쓸 수 있고, 후손 개발자 입장에서도 어떤 것을 넣어야하는 변수인지 알기 쉽다._  4. 추상화 레벨method를 추출한다는 것 자체가 외부 세계와 내부 세계의 경계를 만든다는 뜻이다. 하나의 세계 안에서는 추상화 레벨이 동등해야 한다.추상화 레벨이 맞지 않아 일어나는 문제가 꽤나 잘 들어난다.추상화 레벨이 맞지 않는 상황이 나타나면 클린코드라 하기 어렵다. 자세한 사항은 개인 블로그에 기재하였습니다.https://velog.io/@dhlee47-l/Readable-Code-%EC%9D%BD%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EC%82%AC%EA%B3%A0%EB%B2%95-Day2

웹 개발CleanCode박우빈강사님추상JAVA발자국

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

채널톡 아이콘