블로그
전체 4#카테고리
- 백엔드
#태그
- 인프런
- 인프런워밍업클럽
- 스터디1기
- 워밍업
2024. 06. 06.
0
[인프런 워밍업 클럽 Study] 1기 백엔드 후기
1. 신청 사실 저는 인프런 워밍업 클럽 0기 참여자였지만, 이때에는 참여하고 있던 부트캠프에서 프로젝트를 진행하는 도중이라 너무 바빠 중간에는 참여하지 못했습니다. 이러한 이유로 아쉽게도 0기 워밍업 클럽 스터디는 중도포기 하였지만 당시에 진행중이었던 프로젝트는 무사히 끝났고, 이후 1기에 다시 모집을 시작하는 것을 보고 다시 재도전을 하게 되었습니다. 2. 진행 강의는 Spring Boot를 이용한 기초적인 프로젝트를 통해 직접 배포까지 하는 것을 목표로 하는 것이었습니다. 좋았던 점은 Front 부분에 대해서는 예제 코드를 제공하고 있어 수강생들은 온전히 Back-end 공부에만 전념할 수 있다는 점이었습니다. 강의 난이도는 전체적으로 쉬운 편이었다고 생각합니다. 개인적으로 Spring Boot와 JPA, 배포에 대해 이렇게 쉽게 설명해 주시는 강사님께 감탄하기도 하였습니다. 그렇지만 아무래도 강의 중점이 Java보다는 Spring Boot에 초점이 맞춰져 있기 때문에 강의 내용이 쉽다 하더라도 기본적인 Java 지식은 충분히 갖추고 있어야지 이해하기 쉽겠다는 생각은 하였습니다. 스터디에 참여한 이유는 아무래도 혼자서 공부하기에는 동기부여가 잘 되지 않아서라는 점이 컸던 것 같습니다. 단순히 스터디에 참여하는 것 뿐만이 아니라 과제나 발자국 작성을 통하여 배운 내용들을 복습할 수 있도록 하고, 추가로 인프런 포인트까지 준다고 하니 마다할 이유가 없었습니다. 덕분에 스터디를 진행하면서 새로 배웠던 지식들과 기존에 가지고 있던 지식들을 정리할 수 있는 시간이 되어 유익했습니다. 3. 후기 개인적으로는 강의 외적으로도 많은 것을 배웠던 시간이었던 것 같습니다. 특히 금요일에 있었던 Q&A 시간에서 클린 코드와 Test-driven Development에 대해 다뤘던 시간이 있었는데, 이전에 프로젝트를 진행하면서 마감에 쫒겨 구현에만 급급했던 점을 반성하고 효율적인 개발론, 보다 더 바람직한 개발론에 대해 고찰해보는 기회가 되었습니다. 또한 저 혼자 공부하게 될 경우 다른 사람에게 도움을 받기 어려워 과연 제대로 하고 있는 것인가에 대해 생각하기 어렵지만 이번 스터디를 통하여 다른 사람들과 코드를 공유하며 다른 사람의 코드와 나의 코드의 다른 점이 무엇인지, 어떤 코드가 더 좋은 코드인지 생각할 수 있는 기회가 되어 유익했습니다. 아쉽게도 현재 지방에 거주하고 있는 상황이라 서울에서 진행되는 오프라인 수료식에는 참석하지 못했지만, 대신에 Q&A 시간에는 참석할 수 있어서 이 자리를 통해 신입 개발자로서 가질 수 있는 여러 가지 궁금한 점에 대해 해소할 수 있어 좋았습니다. 이러한 자리를 만들어 주신 인프런 측과 강의를 진행하신 최태현 강사님, 그리고 같이 스터디에 참여한 워밍업 클럽 1기 분들께 모두 감사하다는 말씀을 마지막으로 이만 후기를 마치겠습니다.
백엔드
・
인프런
・
인프런워밍업클럽
・
스터디1기
2024. 05. 19.
0
[인프런 워밍업 클럽 Study] 백엔드 3주차 발자국
학습 내용 요약 실수할 여지가 많으며, 실수 시 인지하는 시점이 느리다SQL 작성 시 오타가 발생할 경우 IDE에서 자체적으로 확인해주는 것이 아니라면 보통은 런타임 에러로 처리가 되어서 실제로 서버가 가동될 때 에러가 발생하여 문제가 더 커질 가능성이 있음.특정 데이터베이스에 종속적이게 된다.데이터베이스마다 SQL 문법이 조금씩 다르기 때문에 데이터베이스를 바꾸게 되면 이미 작성한 SQL문도 잘못된 부분이 있으면 하나하나 다 바꿔줘야 함.반복작업이 많아진다.테이블을 하나 만들 때마다 기본적인 INSERT / SELECT / UPDATE / DELETE 쿼리는 필요하며, SELECT 쿼리를 할 때마다 필드 하나하나를 매핑해주는 것이 번거롭다.데이터베이스와 객체는 패러다임이 다르다.대표적으로 연관관계와 상속에서 이러한 차이점이 두드러진다. ORM (Object-Relational Mapping) : 관계형 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 자동으로 매핑(연결)해주는 프로그래밍 기법JPA : 객체와 관계형 데이터베이스의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙Hibernate : JPA를 구현한 구현체. @Entity : 특정 객체에 붙여, 해당 객체를 DB 테이블로 인식하게 해주는 어노테이션.@Id : 객체 필드에 붙여 그 객체 필드를 primary key로 간주하게 하는 어노테이션.@GeneratedValue : 기본키의 생성 전략을 정의하기 위한 어노테이션.생성 전략으로는 Table, Sequence, Identity, Auto가 있으며, 기본값은 Auto임.@Column : 객체 필드를 테이블 컬럼에 매핑하는 어노테이션.nullable : null 값의 허용 여부를 설정unique : 유일성 조건 여부를 설정length : 문자 길이 제약조건을 설정 spring.jpa.hibernate.ddl-auto스프링이 시작할 때 DB에 있는 테이블을 어떻게 처리할지에 대한 옵션create : 기존 테이블이 있다면 삭제 후 다시 생성create-drop : 스프링이 종료될 때 테이블을 삭제update : 객체와 테이블이 다른 부분만 변경validate : 객체와 테이블이 동일한지 확인none : 별다른 조치를 하지 않음spring.jpa.properties.hibernate.show_sqlJPA를 사용해 DB에 SQL을 날릴 때 SQL 쿼리문을 보여주는 것에 대한 설정spring.jpa.properties.hibernate.format_sqlJPA를 사용해 DB에 SQL을 날릴 때 SQL을 예쁘게 포맷팅하는 것에 대한 설정spring.jpa.properties.hibernate.dialect데이터베이스의 종류를 설정해주기 위한 방언 설정 Repositorypublic interface UserRepository extends JpaRepository { } Repository에서 JpaRepository를 상속받도록 설정하고, 테이블의 매핑 객체인 User 와 유저 테이블의 id인 Long 타입을 각각 적어주어야 한다. 간단하게 사용할 수 있는 JPA 명령어userRepository.XXX()save : 주어진 객체를 저장하거나 업데이트 한다.findAll : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.__By__ : id를 기준으로 특정한 1개의 데이터를 가져온다. By 앞과 뒤에 어떤 단어가 들어가는지에 따라 쿼리를 마음껏 만들어낼 수 있다By 앞에는 find, findAll, exists, count 등이 들어갈 수 있다.By 뒤에는 필드 이름이 들어가며, and나 or 로 조합될 수 있다.ex) findAllByNameAndAge = select * from user name = ? and age = ?ex) findAllByNameOrAge = select * from user name = ? or age = ?동등 조건 외에 다양한 조건을 활용할 수도 있다.GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, Between, StartsWith , EndsWith 등… 트랜잭션 : 쪼갤 수 없는 업무의 최소 단위commit : 트랜잭션 시작 후 실행된 SQL 명령을 DB에 반영rollback : 트랜잭션 시작 후 실행된 SQL 명령을 반영하지 않고 취소대상 메소드에 @Transactional 어노테이션을 붙여 트랜잭션을 적용할 수 있다.트랜잭션 실행 로직은 다음과 같다.서비스 메소드가 시작할 때 트랜잭션과 영속성 컨텍스트가 시작돈다.서비스 메소드 로직이 모두 정상적으로 성공하면 commit 된다.서비스 메소드 로직 실행 도중 문제가 생기면 rollback 된다.트랜잭션이 종료될 때 영속성 컨텍스트도 종료된다.영속성 컨텍스트의 특징변경 감지 (Dirty Check) : 영속성 컨텍스트 안에서 불러온 Entity는 명시적으로 save 를 해주지 않더라도 알아서 변경을 감지하여 저장된다.쓰기 지연 : 여러 SQL 문을 실행시켜도 이 쿼리문들을 모아 commit 되는 시점에 한번에 DB에 적용시켜준다.1차 캐싱 : ID를 기준으로 Entity를 기억하는 기능으로, SELECT 문을 사용하여 특정 엔티티를 불러올 경우 쿼리문이 한 번만 발생하며, 이후 같은 엔티티를 불러올 경우 영속성 컨텍스에 저장된 엔티티를 불러오게 된다. 회고저번 주에 클린 코드에 대한 강의를 듣고 이번 주에 과제를 진행하면서 클린 코드를 적용해보기로 했지만 생각보다 쉽지 않아 아쉬웠던 것 같습니다. 이번 주 금요일에 진행했었던 QNA 코드리뷰 시간에서는 throw new를 적용할 때 발생하는 동시성 이슈, N+1 문제, @Transactional 어노테이션의 readonly 옵션, enum 클래스의 활용, ApiUrlConstants로 API 주소를 관리하는 기법 등이 기억에 남았습니다. 이제 마지막으로 최종 과제만 남았는데, 남은 시간동안 테스트 코드를 이용하여 최종 과제를 해결하는 것은 어려워도 지금까지 배운 클린 코드에 대한 지식으로 최대한 깔끔한 코드를 작성해보도록 노력할 것입니다.
백엔드
・
워밍업
2024. 05. 12.
0
[인프런 워밍업 클럽 Study] 백엔드 2주차 발자국
학습 내용 요약 좋지 않은 코드를 작성할 때의 문제점협업에 어려움을 겪게 된다가독성이 떨어져 생산성이 낮아진다코드 수정 시 다른 코드에 끼칠 영향으로 인해 수정이 어려워진다테스트에 어려움을 겪게 된다종합적으로, 유지보수성이 매우 떨어지게 된다 각 클래스가 각자의 역할을 가지고 겹겹이 쌓인 것을 의미한다[ Repository ] → [ Service ] → [ Controller ] + ( DTO ) @RestController public class UserController { private final UserService userService; public UserController(JdbcTemplate jdbcTemplate) { this.userService = new UserService(jdbcTemplate); } } 위 코드에 대한 의문은 다음과 같다.클래스 안에 있는 함수를 사용하기 위해서는 인스턴스화가 필요하다. UserController에 있는 메소드를 API 진입 지점으로 사용하고 있으나 현재 UserController는 인스턴스화가 되어있지 않다.UserController의 생성자는 JdbcTemplate에 의존하고 있으나 JdbcTemplate에 대한 처리 없이 UserController에서 JdbcTemplate를 가져오고 있다.@RestControllerUserController 클래스를 API의 진입 지점으로 설정해준다.UserController 클래스를 스프링 빈으로 등록시킨다.@SpringBootApplication이 다양한 설정들을 모두 자동으로 해준다. 이때 자동으로 해주는 것 중 하나가 스프링 서버 내부에 거대한 컨테이너를 만드는 것이다.컨테이너 안에 클래스가 들어가게 되며 이렇게 들어간 클래스를 스프링 빈이라고 한다. 클래스가 들어갈 때는 이 빈을 식별할 수 있는 이름 및 타입과 함께 다양한 정보들이 저장된다. 그리고 이때 인스턴스화도 함께 이뤄진다.JdbcTemplate 역시 스프링 빈으로 등록되어 있다. build.gradle에 설정했던 spring-boot-starter-data-jpa 의존성이 JdbcTemplate 을 스프링 빈으로 미리 등록해 준 것이다.스프링 컨테이너는 UserController를 인스턴스화할 때, UserController가 필요로 하는JdbcTemplate 을 컨테이너 내부에서 찾아 인스턴스화를 진행해 준다. 만약 이때 JdbcTemplate이 없다면 에러가 발생한다.정리하자면, 서버를 시작하게 되면 다음과 같은 일이 순차적으로 일어난다.컨테이너가 시작된다.컨테이너에 기본적으로 많은 스프링 빈이 등록된다. (ex. JdbcTemplate)스프링을 사용하는 개발자가 설정해 준 스프링 빈이 등록된다. (ex. UserController)이때 필요한 의존성이 자동으로 설정된다. (ex. UserController를 만들 때 JdbcTemplate을 자동으로 넣어준다)Repository와 Service 또한 각각 @Repository와 @Service 어노테이션으로 스프링 빈으로 등록시켜줄 수 있다. IoC (Inversion of Control, 제어의 역전)프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다.IoC의 목적작업을 구현하는 방식과 작업 수행 자체를 분리한다.모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있다.다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 된다.모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.출처 : 위키백과 ( https://ko.wikipedia.org/wiki/제어_반전 ) DI (Dependency Injection : 의존성 주입)하나의 객체가 다른 객체의 의존성을 제공하는 것을 의미한다.DI의 장점의존성 주입은 클라이언트의 구성 가능성을 유연하게 해준다. 클라이언트의 행위는 고정되어 있다. 클라이언트는 클라이언트가 기대하는 고유한 인터페이스를 지원하는 모든 것을 할 수 있다.의존성 주입을 통해 시스템의 구성 세부 사항을 외부의 구성 파일에서 사용하여 리컴파일 없이 시스템을 재구성할 수 있다. 분리된 구성은 컴포넌트의 여러 구현을 요구하는 다양한 상황을 위해 작성될 수 있다. 이는 국한되어 있지는 않지만 테스팅을 포함한다.의존성 주입은 코드의 동작에서의 어떠한 변경도 요구하지 않으므로 리팩터링으로써 레거시 코드에도 적용할 수 있다. 클라이언트는 더 독립적이며 테스트에 속하지 않은 다른 객체를 가장하는 stubs 또는 모의 객체를 사용해 독립된 유닛 테스트가 더 쉬워지는 결과를 얻는다.의존성 주입을 통해 클라이언트는 사용해야하는 모든 구체적인 구현에 대한 지식을 제거할 수 있다. 디자인 변경이나 결함의 영향으로부터 클라이언트를 독립하는데 도움을 주며, 이는 재사용성, 테스트가능성, 유지가능성을 향상시킨다.출처 : 위키백과 ( https://ko.wikipedia.org/wiki/의존성_주입 ) @Primary 와 @Qualifier@Primary : 여러 개의 Bean들 중 사용할 Bean에 붙이는 어노테이션.@Qualifier : Bean에 추가 구분자를 붙여주는 방법으로 생성자에서 해당 구분자를 명시하면 그 구분자를 가진 Bean을 주입해준다.@Primary와 @Qualifier 중에 @Qualifier의 우선순위가 더 높다.@Configuration 와 @Bean@Configuration : 클래스에 붙이는 어노테이션으로, @Bean을 사용할 때 함께 사용해 주어야 한다.@Bean : 메소드에 붙이는 어노테이션으로, 메소드에서 반환되는 객체를 스프링 빈에 등록한다.보통 직접 만든 클래스를 스프링 빈으로 등록할 때에는 @Service나 @Repository를 사용하고, 외부 라이브러리나 프레임워크에 만들어져 있는 클래스를 스프링 빈으로 등록할 때에는 @Configuration + @Bean 조합을 많이 사용하게 된다.@Component@RestController, @Service, @Repository, @Configuration은 모두 @Component 어노테이션을 가지고 있다.@Component 어노테이션을 붙이면 주어진 클래스를 ‘컴포넌트'로 간주하고, 컴포넌트들은 스프링 스프링 서버가 뜰 때 자동으로 감지된다. @Component 덕분에 지금까지 우리가 사용했던 어노테이션들이 모두 자동으로 감지되었던 것이다.@Component 어노테이션은 컨트롤러, 서비스, 리포지토리가 아닌 추가적인 클래스를 스프링 빈으로 등록할 때에도 사용된다. 1. 생성자를 이용한 주입보통 제일 우선시되는 방법이다.@Repository public class UserRepository { private final JdbcTemplate jdbcTemplate; // 생성자에 JdbcTemplate이 있으므로 스프링 컨테이너가 넣어준다. public UserRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } ... } 2. setter를 이용한 주입setter 메소드에 @Autowired 어노테이션을 사용하여 주입한다.@Repository public class UserRepository { private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } ... } 3. 필드에 직접적으로 주입필드 위에 @Autowired 어노테이션을 사용하여 주입한다.@Repository public class UserRepository { @Autowired private JdbcTemplate jdbcTemplate; ... } 4. @Qualifier 어노테이션을 이용한 주입@Qualifier 어노테이션은 Spring Bean을 사용하는 쪽과 등록하는 쪽 모두 사용할 수 있다.@Service @Qualifier("main") public class BananaService { ... } @RestController public class UserController { private final UserService userService; private final FruitService fruitService; public UserController(UserService userService, @Qualifier("main") FruitService fruitService) { this.userService = userService; this.fruitService = fruitService; } ... } 회고이번 주에는 지난 금요일에 들었던 깜짝 특강이 기억에 남았습니다. 테스트 코드에 대한 것은 막연하게 들어만 봤었습니다. 얼마 전에 프로젝트를 진행하면서 팀원이 사용한 것을 보긴 했지만, 당시에 저는 프론트앤드 역할이라 테스트 코드에 대해서 고찰해 볼 기회가 적었습니다. 이렇듯 테스트 코드를 실제로 적용한 적은 없었지만 지난 특강으로 클린코드에 대한 개념과 더불어 테스트 코드의 작성에 대한 개념을 익히게 되어 도움이 많이 되었습니다.
백엔드
・
워밍업
2024. 05. 05.
0
[인프런 워밍업 클럽 Study] 백엔드 1주차 발자국
학습 내용 요약프로젝트에서 사용하는 라이브러리 혹은 프레임워크 프로그래밍에서 미리 만들어진 기능을 가져다가 사용하는 것ex) 김치찌개를 만드는 상황에서, 처음부터 배추를 직접 재배하여 김치를 담근 후 만들 수도 있고, 마트에서 김치를 사서 만들 수도 있음. 후자의 경우가 라이브러리를 사용하는 경우와 유사하다고 할 수 있음. 프로그래밍에서 미리 만들어져 있는 구조에 코드를 가져다 끼워넣는 것ex) 김치찌개를 만드는 상황에서, 여러 재료들을 사서 만들 수도 있고, 원데이 클래스에 가서 선생님이 시키는 대로 만들 수도 있음. 후자의 경우가 프레임워크를 사용하는 경우와 유사하다고 할 수 있음. 어떠한 기능을 제공하는 프로그램, 그리고 그 프로그램을 실행시키고 있는 컴퓨터누군가의 요청이 있어야 기능을 제공할 수 있음. 이세계 ↔ 현실세계택배 시스템 ↔ 네트워크집 ↔ 컴퓨터(주소) B부족 감자동 곰로 13번길 2 ↔ (IP) 244.77.51.9(집주소 별칭) 파란집 ↔ (도메인 이름) spring.com(택배를 정말 받는 사람) 둘째 ↔ (port) 3000 HyperText Transfer ProtocolProtocol : 표준, 약속 GET /portion?color=red&count=2 Host: spring.com:3000 POST /oak/leather Host: spring.com:3000 오크가죽정보 GET, POST"HTTP Method"HTTP 요청을 받는 컴퓨터에게 요청하는 행위ex) GET : 데이터를 달라, POST : 저장하라GET, POST, PUT, DELETE 등...Host: spring.com:3000HTTP 요청을 받는 컴퓨터와 프로그램 정보/portion, /oak/leather"Path"HTTP 요청을 받는 컴퓨터에게 원하는 자원?, &구분기호color=red, count=2"Query"key와 value로 구성자원의 세부 조건오크가죽정보"Body"실제 저장할 오크 가죽 정보행위와 자원은 HTTP 요청을 보내기 전에 약속해야 한다 GET : 데이터를 달라, 쿼리POST : 데이터를 저장하라, 바디PUT : 데이터를 수정하라, 바디DELETE : 데이터를 삭제하라, 쿼리 Application Programming Inteface정해진 약속을 하여, 특정 기능을 수행하는 것 POST /oak/leather Host: spring.com:3000 오크가죽정보 POST /oak/leather : 메소드 패스 쿼리Host: spring.com:3000 : 헤더 (여러줄 가능)중간에 한 줄 띄기오크가죽정보 : 바디 (여러 줄 가능) Uniform Resource Locatorhttp사용하고 있는 프로토콜:// , ?구분 기호spring.com:3000도메인 이름포트, 도메인 이름은 IP로 대체 가능하다/portion자원의 경로 (Path)color=red&count=2추가정보 (Query) 서버 : 요청에 대한 응답을 제공(serve)한 컴퓨터클라이언트 : 요청을 한 컴퓨터상태 코드200 OK300 Moved Permanently404 Not Found500 Internal Server Error그외 등등…응답에는 추가 정보(바디)를 담을 수도 있음.ex) 200 OK, 빨간 포션 2개HTTP 응답 역시 요청과 구조가 동일함HTTP/1.1 200 OK Content-Type: application/json { "name": "A", "age": null } 첫째 줄 - 상태코드여러 줄 - 헤더한 줄 띄기여러 줄 - 바디 @RestController public class CalculatorController { @GetMapping("/add") public int addTwoNumbers ( @RequestParam int number1, @RequestParam int number2 ) { return number1 + number2; } } ControllerAPI의 입구@RestControllerClass를 Controller로 등록하는 어노테이션@GetMapping("/add")아래의 함수를 HTTP Method가 GET이고 HTTP path가 /add인 API로 지정하는 어노테이션@RequestParam주어지는 쿼리를 함수 파라미터에 넣는 어노테이션 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; } } Data Transfer Object데이터를 외부에서 서버 안 Controller로 전달(request)하거나 서버 밖으로 응답(response)하는 역할 { "name": "AAA", "age": 99, "house": { "address": "대한민국 서울", "hasDoor": true, "dogs": ["코코", "초코"] } } JavaScript Object Notation웹 통신에서 객체를 표기하는 기법JSON 표기는 중괄호가 양 끝에 있음중괄호 안에 ”key”: value 로 표기‘속성’ 각각은 쉼표로 구분 @PostMapping("/multiply") public int multiplyTwoNumbers ( @RequestBody CalculatorMultiplyRequest request ) { return request.getNumber1() * request.getNumber2(); } @PostMapping(”/multiply”)아래 함수를 HTTP Method가 POST이고 Path가 /multiply인 API로 지정하는 어노테이션@RequestBodyHTTP Body로 들어오는 JSON을 CalculatorMultiplyRequest 로 바꿔줌 과제https://smkim-create-server.notion.site/1-Annotation-c343593b07a54d4793cf98f851eb696a처음에는 어노테이션이라는 것이 앞에 골뱅이가 달리고 뒤에 단어가 적혀있는 것으로만 막연하게 이해하고 있었는데, 이 과제를 통하여 어노테이션에 대한 정의(코드에 대한 부가 정보를 제공하는 메타 데이터)와 역할(코드에 대한 설명과 컴파일러 명령 등을 표현) 및 어노테이션을 사용함으로써 얻을 수 있는 효과(개발자 입장에서 더욱 편리하고 가독성 높은 개발이 가능), 그 외 각종 어노테이션의 종류에 대해 알 수 있었다.커스텀 어노테이션을 만들 수 있다는 것을 이 강의를 통하여 처음 알 수 있었는데, 얼마 전에 진행했던 프로젝트에서 강의에서 배운 내용을 토대로 하여 커스텀 어노테이션을 만들어 사용하도록 함으로써 더욱 편리하게 DB에 저장된 유저의 정보를 불러오게 하여 팀원들의 개발 효율성을 더욱 높힐 수 있었다. https://smkim-create-server.notion.site/2-API-be6842d43aa84b348a5e0c6d4fa32877강의에서 배운 각종 API들과 Controller 및 DTO의 개념을 종합하여 과제를 해결하였다.흔히 setter 사용을 지양하라는 말이 있는데, 과제 해결의 편의를 위하여 부득이하게 setter를 사용하여 값을 받았다. setter를 사용하지 않고 들어오는 값을 받을 수 있는 방법에 대해 좀 더 고민해봐야 될 것 같다. https://smkim-create-server.notion.site/3-Lambda-6c8726c1cce546faa9270af2a593bef6자바의 람다식이 함수형 프로그래밍을 지원하기 위해 등장하였다는 배경에 대해 알게 되었고, 람다식을 사용함으로써 얻을 수 있는 장점, 익명 클래스(클래스 선언과 객체 생성을 동시에 하는 이름 없는 클래스)에 대해서도 알 수 있었다. 막연하게 알고 있었던 개념에 대해서 한번 더 정리할 수 있어서 좋았다.과제를 해결할 때, 가능하면 공식 문서를 위주로 하여 참고할 수 있도록 해야겠다.
백엔드
・
워밍업