블로그
전체 32024. 05. 19.
0
[인프런 워밍업 클럽 1기] BE 3주차 발자국
세 번째 걸음인프런 워밍업 클럽 1기 BE에서 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의를 수강하며 작성하였다. 강의 학습스프링 컨테이너다른 DB를 사용할 때, Repository의 역할을 수정하면 이를 호출하는 Service의 코드까지 수정해야 한다.스프링 컨테이너는 Service를 인스턴스화하고, 필요한 Repository를 알아서 결정해 준다.컨테이너가 구현체를 알아서 결정해 주는 방식을 제어의 역전(IoC)라고 한다.컨테이너가 선택해 클래스에 넣어 주는 과정을 의존성 주입(DI)라고 한다.Repository가 여러 개일 경우, @Primary를 붙여 우선순위를 부여해 준다. Spring Data JPASQL을 직접 작성하지 않고 객체와 관계형 DB를 짝지어 자동으로 쿼리를 날리는 방법DB 테이블에 대응되는 Entity Class@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id = null; @Column(nullable = false, length = 20, name = "name") private String name;@Id를 입력하면 Primary Key로 간주된다.@GeneratedValue(strategy = GenerationType.IDENTITY)는 AUTO_INCREMENT와 같다.@Column을 이용해 객체와 DB의 이름을 매핑하고, Null 여부와 문자열 길이 제한 등을 설정한다.protected User() {}JPA를 사용하기 위해 기본 생성자가 꼭 필요하다.JPA를 활용한 Servicepublic void saveUser(UserCreateRequest request) { userRepository.save(new User(request.getName(), request.getAge())); } public List getUsers() { return userRepository.findAll().stream() .map(UserResponse::new) .collect(Collectors.toList()); }save()에 객체를 넣어주면 INSERT SQL이 자동으로 날아간다.findAll()은 SELECT * FROM user와 같이 모든 데이터를 가져온다.그 외에 By 구절을 통해 자동으로 SQL 쿼리를 날릴 수 있다. 과제 수행6일차 과제 : Controller 3단 분리하기API와 HTTP 관련 역할은 Controller 코드에서,분기 처리와 로직 담당은 Service 코드에서,DB와의 접근 담당은 Repository 코드에서 각자의 역할만 수행하도록 분리하였다.Repository를 Interface로 만들어 다양한 DB 연결 방식이 필요할 때 구현하여 활용할 수 있다. 7일차 과제 : JPA 적용하기Entity 코드를 작성해 DB와 객체를 짝짓고, 예외 처리 로직을 작성한다.save, upodate, countBy~, findBy~를 통해 SQL을 직접 작성하지 않고 쿼리를 전송한다.Repository를 Interface로 만들어 Service에서 구현하여 사용하였다. 느낀 점JPA를 사용하니 길었던 Repository 코드가 몇 줄로 줄어들었고, SQL을 직접 작성하지 않아도 되어 편리했다. Controller - Service - Repository의 3단 구조와 함께 Entity, DTO를 사용하여 각 클래스가 자신의 역할만 맡아 수행할 수 있도록 구현하였는데 코드를 작성하는 것뿐만 아니라 보고 읽었을 때 이해가 쉬웠다.
백엔드
2024. 05. 12.
0
[인프런 워밍업 클럽 1기] BE 2주차 발자국
두 번째 걸음인프런 워밍업 클럽 1기 BE에서 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의를 수강하며 작성하였다. 강의 학습Clean Code개발자는 요구사항을 구현하기 위해 코드를 작성하지만, 협업하는 경우 코드 작성 시간보다 코드를 읽는 시간이 더 많게 된다.따라서, 코드만 보고도 의미 파악이 가능하도록 Clean Code 리펙토링을 진행해야 한다.함수는 최대한 작게 만들고 한 가지 일만 수행클래스는 작아야 하며 하나의 책임만을 가짐그동안 작성하였던 Controller 코드를 3개의 역할로 나누어 보았다.API의 진입 지점으로써 HTTP Body를 객체로 변환 현재 유저가 있는지 확인하고 예외 처리 SQL을 이용해 DB와의 통신 담당 Controller는 Service를 참조하고, Service는 Repository를 참조하기 때문에 불필요한 정보를 포함할 필요가 없도록 리펙토링하는 것도 중요하다. Spring Bean스프링 빈이란, 서버가 시작될 때 생성되는 거대한 컨테이너이다.컨테이너 안에는 여러 클래스가 들어갈 수 있으며, 다양한 정보와 함께 인스턴스화도 이루어진다.Controller는 @RestController, Service는 @Service, Repository는 @Repository를 입력해 스프링 빈으로 등록할 수 있다.JdbcTemplate같은 경우 build.gradle에 설정해놓은 Dependency(의존성)가 스프링 빈으로 미리 등록해 준다.스프링 빈을 이용하면 이렇듯 원래 역할이었던 Controller만이 JdbcTemplate를 참조하도록 만들 수 있다. 과제 수행5일차 과제 : Clean Code 적용하기Clean Code를 작성하는 방법을 조사하고 실제 코드에 적용시켜보았다.의미 있는 이름 사용하기함수는 작게, 한 가지 일만 하도록 만들기메서드 인수는 최대한 적게 받기중복되는 코드 제거하기주석 활용하기변하지 않거나, 일괄적으로 바꿔야 하는 숫자는 상수 처리하기 느낀 점이번 주는 자격증 시험 등 일이 많아 과제를 제때 제출하지 못한 것이 아쉬웠다.개발자들은 코드를 작성하는 것 만큼이나 코드를 읽는 일도 많으므로 단순히 돌아가는 코드가 아닌, 클린 코드 리펙토링을 통해 보기 쉬운 코드로 만드는 것의 중요성을 깨달았다.스프링 빈과 이를 등록하기 위한 어노테이션은 코드를 구현하면서 그 의미와 역할에 대해 자세하게 생각해보지 않았는데, 강의자님의 자세한 설명과 알기 쉬운 예시로 개념에 대해 알게 되었다. 이를 통해 프로그램에서 기능을 구현할 때에도 이 코드가 왜 쓰였는지 생각해보는 습관을 들이게 될 것 같다.
백엔드
2024. 05. 05.
0
[인프런 워밍업 클럽 1기] BE 1주차 발자국
첫 걸음인프런 워밍업 클럽 1기 BE에서 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의를 수강하며 작성하였다.강의 학습HTTP와 APIHTTP란 다른 컴퓨터로 데이터를 보내기 위한 데이터 표준이다.API는 정해진 약속에 따라 특정 기능을 수행하는 코드이다. HTTP Method 중 하나인 GET은 쿼리를 통해 정보를 보낸 후 데이터를 요청한다.→ /add?number1=10&number2=20 Controller는 API가 실행되는 입구와 같다.@GetMapping("/add") public int addTwoNumbers(@RequestParam int number1, @RequestParam int number2) { return number1 + number2; } GET 방식에서 매개변수를 각각 하나씩 입력받을 때에는 @RequestParam을 사용하여 변수에 쿼리의 값을 넣는다.만약 매개변수가 많을 경우, DTO 객체로 만들어 관리한다.@Getter public class CalculatorAddRequest { private final int number1; private final int number2; public CalculatorAddRequest(int number1, int number2) { this.number1 = number1; this.number2 = number2; } }GET 방식의 DTO 객체는 반드시 생성자를 포함해야 한다. DTO 객체를 이용한 Controller는 다음과 같다.@GetMapping("/add") public int addTwoNumbers(CalculatorAddRequest request) { return request.getNumber1() + request.getNumber2(); }DTO를 이용할 때는 @RequestParam을 제거해야 하며 변수를 객체로 감싸 불러오기 때문에 getter를 사용해야 한다. 마찬가지로 HTTP Method인 POST는 Body를 통해 정보를 보낸다.객체 표기법인 JSON을 사용하고, List를 사용하거나 JSON 안에 JSON을 사용하는 것도 가능하다.POST 방식에서 DTO를 이용한 Controller는 다음과 같다.@PostMapping("/multiply") public int multiplyTwoNumbers(@RequestBody CalculatorMultiplyRequest request) { return request.getNumber1() * request.getNumber2(); } @RequestBody를 사용하여 HTTP Body로 들어오는 JSON을 DTO 객체 형태로 변환한다.GET 요청의 @RequestParam과는 달리 DTO 객체를 사용해도 Annotaion을 생략할 수 없다. GET 요청과 달리 POST 요청은 생성자가 필요하지 않다. Domain(Entity)와 DTO의 차이DTO는 계층 간 데이터 교환을 위해 사용된다. 반면, Domain은 DB 테이블과 매핑되어 데이터를 저장하거나 관리하는 실제 비즈니스 도메인을 표현한다. DTO는 단순히 어떤 데이터로 통신할 것인지 정의하고, 상세한 정의는 Domain에서 한다. Spring에서 Database 사용하기private final JdbcTemplate jdbcTemplate; public UserController(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @PostMapping("/user") public void saveUser(@RequestBody UserCreateRequest request) { String sql = "insert into user (name, age) values (?, ?)"; jdbcTemplate.update(sql, request.getName(), request.getAge()); }JdbcTemplate를 이용하면 Spring에 SQL을 전달할 수 있다.SQL문을 작성하여 문자열 변수로 저장하는데, 값이 들어갈 부분에 ?를 사용하면 데이터를 넣을 수 있다. 과제 수행1일차 과제 : JAVA Annotation어노테이션은 실제 데이터가 아닌 메타데이터로써 클래스와 메서드에 추가하여 다양한 기능을 부여한다.반복적인 코드 작성을 줄일 수 있어 코드량이 감소하고, 코드의 역할을 명확히 지정할 수 있어 유지보수가 용이하다는 장점이 있다.사용자가 원하는 기능을 수행하는 커스텀 어노테이션을 만드는 방법도 알아보았다. 2일차 과제 : GET & POST API날짜를 받는 API를 구현할 때, String으로 날짜를 받은 후 LocalDate로 변환하는 과정을 거쳤다.그러나, 스프링 부트 2버전에서는 @DateTimeFormat을 사용해 LocalDate를 바로 받을 수 있다고 한다.3버전대에서는 어노테이션 없이 LocalDate를 바로 받을 수 있다. 3일차 과제 : 람다식과 익명 클래스익명 클래스란 이미 정의되어 있는 부모 클래스의 자원을 일회성으로 재정의한 클래스이며, 자식 클래스를 정의할 필요 없이 객체화가 가능하다.람다란 자바의 인터페이스를 익명 클래스로 구현한 익명 구현 객체를 짧게 표현한 것이다. 메서드 타입과 이름, 매개변수 타입, 중괄호, return문을 생략하고 화살표 기호를 넣는다. 4일차 과제 : 과일 가게 API 만들기enum 타입을 통해 과일의 판매 여부를 ‘SOLD’, ‘NOT_SOLD’의 두 가지 상태로 구분하였다.COALESCE()를 사용하여 팔린 과일 혹은 팔리지 않은 과일이 존재하지 않을 경우, NULL이 아닌 0으로 표시되도록 하였다.쿼리의 결과가 하나이므로 queryForObject를 이용해 SQL의 결과를 직접 long 타입의 객체로 매핑하였다. 느낀 점Spring의 기초를 복습하면서 ‘이건 왜 이렇게 쓰일까’와 같은 질문을 던지며 천천히 학습할 수 있었다.특히, 인프런의 각 강의에 있는 질문 게시판을 활용하였다.강의를 들으며 의문이 든 부분들은 이미 선배 러너들이 질문을 했고, 강의자 분께서 자세하게 답변을 달아 주셨기 때문에 편하게 학습할 수 있었다. 매일 과제가 있지만 하루에 학습할 양을 안내해 주는 진도표가 존재하고, 하루치 공부 양이 그렇게 많지 않았기 때문에 오히려 꾸준하게 하루 공부를 진행할 수 있어 좋았다.일주일을 돌아보며 작성하는 발자국은 그동안 배운 내용을 정리하고, 느낀 점을 회고할 수 있어 좋은 방법인 것 같다.강의를 들으며 개조식으로 정리한 내용을 글로 풀어 쓰니 내가 얼만큼 이해하고 있는지 확인할 수도 있다.
백엔드
・
워밍업클럽
・
BE
・
발자국
・
1주차