블로그
전체 32024. 03. 10.
0
[인프런 워밍업 클럽 BE 0기] 3주차 발자국
Day 11 : 객체지향과 JPA 연관관계JPA를 이용하여 대출 기능 관계를 수정했다. UserLoanHistory 클래스에서 기존 userId 를 user객체로 설정한 후 @ManyToOne을 이용해 연관관계를 설정했다. N:1 연관관계는 @ManyToOne, @OneToMany를 설정하면 된다. 연관관계 주인을 설정해줘야 하는데 두 클래스 중 상대의 정보를 가지고 있는 쪽이 주인이다. userLoanHistory의 경우도 User 정보를 갖고 있기 때문에 주인이다. 주인이 아닌 쪽에는 mappedBy 설정을 해줘야 한다.@Getter @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false,length=20,name="name") private String name; @Column private Integer age; @OneToMany(mappedBy = "user") private List userLoanHistories = new ArrayList(); protected User() { } public User(String name, Integer age) { if(name==null || name.isBlank()){ throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다",name)); } this.name = name; this.age = age; } public void updateName(String name){ this.name = name; } } @Entity @Getter @NoArgsConstructor public class UserLoanHistory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private User user; private String bookName; private boolean isReturn; public UserLoanHistory(User user, String bookName, boolean isReturn) { this.user = user; this.bookName = bookName; this.isReturn = isReturn; } public void doReturn(){ this.isReturn = true; } } //BookService userLoanHistory 데이터 저장 userLoanHistoryRepository.save(new UserLoanHistory( user,book.getName(),false ));이외에도 JoinColumn, cascade, orphanRemoval 옵션이 있다. Day 12 : 기본적인 배포를 위한 준비 ~ Day 13 : AWS와 EC2 배포배포란 최종 사용자에게 SW를 전달하는 과정이다. AWS에서 EC2를 이용해 가상 서버를 빌릴 수 있다. 명령어를 이용해 EC2에 접속할 수 있다 chmod 400 -> 보안 처리mkdir -> 폴더 생성ls -> 현재 위치에서 폴더나 파일을 확인하는 명령어cd -> 파일로 이동pwd -> 현재 위치를 확인하는 명령어rmdir -> 비어있는 폴더를 제거하는 명령어 강의에 있는 코드를 그대로 사용해 mysql을 설치하다 오류가 발생했다. 이유는 버전 이슈였다. 해결 방법은 아래 링크에 자세히 소개되어 있으니 참고하면 좋을 듯 하다. EC2 인스턴스에서 MySQL 설치시 confliction requests 에러가 발생하는 문제 해결 학기가 시작되어 시간이 없다보니 결국 프로젝트를 1단계만 진행했다. 스터디 기간동안 많은 것을 얻어갈 수 있었고 EC2를 이용해 배포까지 할 수 있어서 좋았다.
2024. 03. 03.
0
[인프런 워밍업 클럽 BE 0기] 2주차 발자국
Day 7 : 스프링 컨테이너의 의미와 사용 방법스프링 컨테이너가 생성되는 과정과 스프링 빈을 등록해서 사용하면 어떠한 장점이 있는지 알아보았다.스프링 컨테이너는 우리가 어떠한 객체를 사용할지 대신 결정해준다. 이를 IoC(제어의 역전)이라고 한다.빈을 만들고 객체간의 의존성을 연결해준 다음 프로그램에게 그 객체를 제공한다DI(의존성 주입)에서 "의존"은 A클래스가 B클래스의 메서드를 실행할 때 A클래스가 B클래스에 의존한다는 뜻으로 해석할 수 있다.만약 회원가입 기능을 MemberService 클래스에서 구현한다 가정했을 때 이 기능은 정확히 MemberRepository의 save 기능을 이용하는 것이다. 그러면 MemberService 클래스는 MemberRepository 클래스에 의존한다고 볼 수 있다. 미션 Fruit 기능들을 JPA를 이용해 변경특정 과일 기준으로 지금까지 가게를 거쳤갔던 과일 개수 세는 기능 개발아직 판매되지 않은 특정 금액 이상 혹은 특정 금액 이하의 과일 목록 조회 기능 개제출과제7 Day 8 : Spring Data JPA를 사용한 데이터베이스 조작JPA를 이용하여 DB를 조작하였다.User 테이블에 대응되는 Enttiy 클래스인 User을 만들었다.UserRepository 인터페이스를 생성한 뒤 JpaRepository 클래스를 상속받아 JPA를 활용하여문자열 SQL 보다 편하게 DB를 조작하였다.public void saveUser(UserCreateRequest request){ User u = userRepository.save(new User(request.getName(), request.getAge())); } userRepository 클래스의 save 메소드는 이미 JpaRepository 클래스에 구현되어 있는 메소드이다.이 메소드를 활용하여 User 정보를 저장하였다. Day 9 : 트랜잭션과 영속성 컨텍스트트랜잭션은 쪼갤 수 없는 업무의 단위이다. SQL문을 실행했을 때 중간에 오류가 발생해서 중단되면 데이터 오류가 발생하기 때문에 모든 SQL을 성공시키거나 하나라도 실패하면 모두 실패시키기 위해 존재한다.영속성 컨텍스트는 테이블과 매핑된 Entity 객체를 관리/보관하는 역할이다.영속성 컨텍스트 기능으로는 변경감지/쓰기지연/1차 캐싱이 있다.@Transactional public void updateUser(UserUpdateRequest request){ User user = userRepository.findById(request.getId()) .orElseThrow(IllegalAccessError::new); user.updateName(request.getName()); userRepository.save(user); //여기서 변경 감지. 이게 없어도 업데이트됨 }@Transactional은 함수 시작 때 트랜잭션이 시작되고 끝나면 트랜잭션을 commit하는 어노테이션이다. Day 10 : 조금 더 복잡한 기능을 API로 구성하기책 관련 API를 개발하였다.Entity 클래스인 Book, JpaRepository를 상속받은 BookRepository, dto, service, controller 클래스를 생성하여 개발하였다. 현재 미니프로젝트 개발을 진행하고 있다. 스스로 개발하는 것 이다보니 어렵다. 최선을 다해서 3단계까지 개발을 할 수 있도록 열심히 하겠다
2024. 02. 25.
0
[인프런 워밍업 클럽 BE 0기] 1주차 발자국
Day 1 : 서버 개발을 위한 환경 설정 및 네트워크 기초스프링 프로젝트를 시작하는 방법과 네트워크, HTTP, API에 대한 개념들을 학습했다.HTTP란 데이터를 주고 받는 표준이다. 행위와 자원은 HTTP 요청을 보내기 전에 약속해야한다.HTTP Method는 GET, POST, PUT, DELETE가 있다.구성은 HTTP Method, Path, Query or Body이다.API는 정해진 약속을 하여 특정 기능을 수행하는 것이다. 미션 어노테이션을 사용하는 이유나만의 어노테이션을 만드는 방법제출과제1 Day 2 : 첫 HTTP API 개발POST API는 HTTP Body를 이용해 데이터를 받는다.곱셈 API의 스펙은 다음과 같다.HTTP Method -> POSTPath -> /multiplyHTTP Body -> {”number1”:숫자,”number2”:숫자}API 반환 결과 -> 숫자 @PostMapping("multiply") public int multiplyTwonNumbers( @RequestBody CalculatorMultiplyRequest request){ return request.getNumber1()* request.getNumber2(); }여기서 @RequestBody는 HTTP Body에 있는 JSON 객체를 CalculatorMultiplyRequest 객체로 변환한다. 미션제시된 API 스펙에 맞게 API 개발제출과제2 Day 3 : 기본적인 데이터베이스 사용Intellij에 있는 Database를 이용해 테이블을 생성했다.Spring에서 만든 테이블을 생성하기 위해 application.properties를 생성하여 database의 url과 driver을 설정했다.기존에 만든 사용자 저장 기능과 조회 기능을 jdbcTemplate를 이용해 database에 접근하는 로직으로 수정하였다.jdbcTemplate.update()를 이용하였고 이는 INSERT, UPDATE, DELETE 쿼리에서 사용할 수 있다. 미션자바의 람다식람다식과 익명 클래스간 관계제출과제3 Day 4 : 데이터베이스를 사용해 만드는 APIjdbcTemplate.update를 이용할 때 인자로는 실행할 sql과 sql에 들어가는 값을 전달해야한다.예를 들어 sql = "UPDATE user SET name = ? WHERE id = ?" 라면jdbc.Template.update(sql,name,id) 가 되어야한다. 예외처리를 하고 싶으면 예외를 발생시켜 500 Internal Server Error이 발생할 수 있도록 한다. 미션제시된 API 스펙에 맞게 API 개발제출과제4 Day 5 : 클린코드의 개념과 첫 리팩토링Controller의 기능을 Controller, Service, Repository 분리하는 리팩토링을 진행했다. 미션제시된 코드를 클린 코드로 리팩토링제출과제5 공부하면서 부족한 점들을 찾을 수 있었다. 그 중 람다식을 잘 몰랐는데 이번을 계기로 공부할 수 있었다.이번주 빠지지 않고 강의와 과제를 했다는 점에서 다행이라고 생각하지만 아직 1주차이기 때문에 방심하지 않고 마지막까지 열심히 공부할 것이다.