Week2회고록(알고리즘 주차)

이용만·2022년 1월 23일
0
post-thumbnail

객체지향 프로그램

객체지향이란(OOP, Object Oriented Programming)
객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.





객체지향 프로그래밍이란?

객체 지향 프로그래밍의 장, 단점

장점
▶코드 재사용이 용이
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
▶유지보수가 쉬움
절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
▶대형 프로젝트에 적합
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.

단점
▶처리 속도가 상대적으로 느림
▶객체가 많으면 용량이 커질 수 있음
▶설계시 많은 시간과 노력이 필요

객체 지향 프로그래밍 키워드 5가지

클래스 + 인스턴스(객체)
클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타정보라고 볼 수 있다.
인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터

추상화
추상화는 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미한다.
즉, "공통의" 속성이나 기능을 묶어 이름을 붙이는 것이다.

캡슐화
캡슐화의 목적 2가지
1.코드를 재수정 없이 재활용하는 것
2.접근 제어자를 통한 정보 은닉

상속
상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것이다.*다중상속은 불가하다. (클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 했다. 자세한 내용은 이전 포스트에 있음.)

다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.
즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.
오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

getter, setter 를 사용하는 이유는 무엇인가요?
멤버변수에 직접접근하지 못하게 private으로 접근지정자를 설정하고 public으로 getter, setter 메서드를 만드는 것을 많이 해왔다.
그러면서 이럴꺼면 어차피 아무나 접근가능한데 왜 private을 할까? 라고 생각했었다.
결론부터 말하면 getter, setter를 사용하면 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.
예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.
getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.

참고 : 기본기를 쌓는 정아마추어 코딩블로그

JVM(Java Virutal Machine)

자바가 공개되기 전에는 모든 컴퓨터 프로그램은 특정 운영체제에 맞게 작성되었기 때문에
새로운 운영체제가 생길 때마다 새로운 프로그램을 만들어야 했습니다.

JVM 특징

  • 플랫폼 어디에서든지 이식 가능
  • 운영체제와 상관없이 독립적으로 관리
  • 자동으로 가비지컬렉터를 이용하여 메모리를 관리 할 수 있습니다.

windows에서 컴파일을 한 파일을 서로 다른 운영체제인 mac이나 linux 이어도
JVM만 있으면 어느 환경이든 할 수 있는 구조입니다 👍

항해5기 Spring

JPA

  • JPA(Spring Data JPA)는 스프링을 위해 태어난 녀석인데요.
  • Java로 코드를 작성하면 SQL로 번역해줄 뿐만 아니라, 기본적인 기능이 거의 완벽하게 들어있습니다.

2-2 RDBMS

  • RDBMS(Relational DataBase Management System)은 컴퓨터에 정보를 저장하고 관리하는 기술 = 고도화된 엑셀

2-4 JPA

JPA란?
JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.

    Repository(클래스)는 JPA를 작동시키는 매개체입니다.repository는 데이터를 접근할 때 사용하는 하나의 도구
  • 설정은 아래 한 줄이면 끝나고요
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • 명령도 그냥 자바로 만들면 됩니다. 와우, 멋지네요 😎

Domain = Entity : 테이블
Repository = SQL : Repository에 써 있는 코드가 jpa 코드를 사용하는 것과 같다.

//Table
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다. 기본생성자를 자동으로 넣어줄 것
@Entity // db기준으로 테이블 역할을 한다는 것을 알리는 것
public class Course {
	
    //SQL
    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // id 생성 시 자동으로 증가 명령
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String tutor;

    public String getTitle() {
        return this.title;
    }

    public String getTutor() {
        return this.tutor;
    }

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

Interface

//CourseRepository : SQL 역할을 대신해주는 녀석
//<Course,Long> : "course = 클래스" , "Long : id 상태"
public interface CourseRepository extends JpaRepository<Course, Long> {
}

인터페이스(인터페이스는 jpa를 사용하는 방법)

  • JPA는 Repository를 통해서만 사용할 수 있습니다.
  • 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보시면 됩니다.

->Course클래스가 course 테이블이 된다.


2-5 JPA 사용하기

//저장
Course course1 = new Course(title, tutor)
repository.save(course1);

//조회
JPA 리턴 타입 : List<Course> 여러개를 보여야 하니까.
List<Course> courseLise = repository.findByAll(); 

#### 2-6 생성일자, 수정일자

@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public class Timestamped {

    @CreatedDate // 생성일자임을 나타냅니다.
    private LocalDateTime createdAt;

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
    private LocalDateTime modifiedAt;
}

@ 붙은것을 어노테이션이라고 해서 스프링한테 "야! 이런 역할이 있어!" 라고 알려주는 것.


2-7 JPA 심화

CRUD
정보관리의 기본 기능
-> 생성(CREATE)
-> 조회(READ)
-> 변경(UPDATE)
-> 삭제(DELETE)

데이터 저장하기 & 조회하기
(Repository의 save와 findAll 이용)

// 데이터 저장하기
repository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));

// 데이터 전부 조회하기
List<Course> courseList = repository.findAll();
for (int i=0; i<courseList.size(); i++) {
    Course course = courseList.get(i);
    System.out.println(course.getId());
    System.out.println(course.getTitle());
    System.out.println(course.getTutor());
}

//// 데이터 하나 조회하기
//repository 왜 있지? SQL을 작성해야하니까! JPA에서는 Repository가 sql 임을 잊지마:D
Course course = repository.findById(1L).orElseThrow(
        () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);

NullPointerException : 가리키는게 없다.

Service
Update 는 Service 부분에 작성

//"자바 코스에 작성"
public void update(Course course) {
    this.title = course.title;
    this.tutor = course.tutor;
    ->풀이 : 코스라는 것을 받았을 때 타이틀과 튜터를 업데이트 해줘라.
}

//Update

//"서비스 패키지에 작성"
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {

		// final: 서비스에게 꼭 필요한 녀석임을 명시
    private final CourseRepository courseRepository;

		// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
		// 스프링에게 알려줌
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    //업데이트를 하기 위해 재료 두가지 필요. id와 코스. 코스 안에는 아이디와 튜터 정보 있음.
    public Long update(Long id, Course course) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course);
        return course1.getId();
    }
}

//


2-8 DTO

Dto
왜 사용하는가? 업데이트 할 때 Course 클래스를 이용해 데이터 받고 있는데, Course 클래스를 전달하는 방식으로 사용하기에 적합할까? 저장, 클라이언트 넘길 때 활용하지만 변경에는 적합하지 않다. 왜? 테이블을 막 건들다보면 코드 작성하다가 다른 사람이 마음대로 변경할 수도 있기 때문에(Course클래스가 변경되는 것은 DB가 바뀌는 것이나 다름 없음)완충재 역할로 DTO 를 사용하는 것이다.

domain에 CourseRequestDto(=코스요청관련 정보 물고 다니는 친구) 자바 파일 생성

@NoArgsConstructor // 
@Getter
@Setter // 정보 설정을 위함.
public class CourseRequestDto {
    private String title;
    private String tutor;

    public CourseRequestDto(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

2-9 API - GET

  • API 👉 클라이언트 - 서버 간의 약속입니다. 클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환합니다.
  • REST 👉 REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다. - 여기에 쓰이는 동사는 우리가 JPA 시간에 배운 CRUD를 지칭합니다. - 즉 A에 대해 생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청을 하는 것이죠. - 예시 - GET /courses → 강의 전체 목록 조회 요청 - GET /courses/1 → ID가 1번인 녀석 조회 요청 - POST /courses → 강의 생성 요청 - PUT /courses/3 → ID가 3번인 녀석 수정 요청 - DELETE /courses/2 → ID 2번인 녀석 삭제 요청 - 주의사항 - 주소에 들어가는 명사들은 복수형을 사용합니다. - /course - 주소에 동사는 가급적 사용하지 않습니다. - /accounts/edit

Controller

데이터 조회 API

@RequiredArgsConstructor
@RestController
public class CourseController {

    private final CourseRepository courseRepository;

    @GetMapping("/api/courses")
    public List<Course> getCourses() {
        return courseRepository.findAll();
    }
}

2-10 API - POST,PUT,DELETE

Post : 생성요청

private final CourseService courseService;

// PostMapping을 통해서, 같은 주소라도 방식이 다름을 구분합니다.
@PostMapping("/api/courses") 
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
		// requestDto 는, 생성 요청을 의미합니다.
		// requestbody 가 없으면 requestDto에 정보가 쏙 들어가질 않는다.
    
		// 저장하는 것은 Dto가 아니라 Course이니, Dto의 정보를 course에 담아야 합니다.
		// 잠시 뒤 새로운 생성자를 만듭니다.
		Course course = new Course(requestDto);
		
		// JPA를 이용하여 DB에 저장하고, 그 결과를 반환합니다.
    return courseRepository.save(course);
}

PUT

@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
    return courseService.update(id, requestDto);
}

Delete

@DeleteMapping("/api/courses/{id}")
public Long deleteCourse(@PathVariable Long id){
courseRepository.deleteByID(id);
return id;
}

@PathVariable 아이디 전달 잘 해줌?


정리

**스프링의 구조는 3가지로 나뉜다.
1. Controller : 가장 바깥 부분으로써, 요청/응답을 처리한다.

    Restcontroller : JSON 자동응답기
    
  1. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분, 업데이트 사용 시 사용
    db와 응답하는 부분을 연결해주는 역할이 service

  2. repository(저장소) : 가장 안쪽 부분으로, DB와 맞닿아 있음.(repository, entity)
    -> 생성 삭제 조회

0개의 댓글