• Lombok
      : JAVA 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리
      • Course.java 
        @Getter - Getter 직접 작성 없이 가능
        @NoArgsConstructor - 기본 생성자 직접 작성 없이 가능
      • CourseService.java
        @RequiredArgsConstructor - CourseRepository 받아오는 것 없이 final 선언만으로도 사용 가능
    • DTO(Data Transfer Object)
      : 데이터 교환을 위한 객체로 클래스를 막 건드리지 않고 완충재로 활용하는 것
      • 생성 및 적용
        1. src > main > java > com.sparta.week02 > domain 에 CourseRequestDto 파일 생성
          @NoArgsConstructor
          @Getter
          public class CourseRequestDto {
              private String title;
              private String tutor;
          
              public CourseRequestDto(String title, String tutor) {
                  this.title = title;
                  this.tutor = tutor;
              }
          }
        2. CourseService.java 변경
          @RequiredArgsConstructor
          @Service
          public class CourseService {
              private final CourseRepository courseRepository;
          
              @Transactional
              public Long update(Long id, CourseRequestDto requestDto) {
                  Course course1 = courseRepository.findById(id).orElseThrow(
                          () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
                  );
                  course1.update(requestDto);
                  return course1.getId();
              }
          }
        3. Course.java 변경
          @Getter
          @NoArgsConstructor
          @Entity
          public class Course extends Timestamped {
          
              @Id
              @GeneratedValue(strategy = GenerationType.AUTO)
              private Long id;
          
              @Column(nullable = false)
              private String title;
          
              @Column(nullable = false)
              private String tutor;
          
              public Course(String title, String tutor) {
                  this.title = title;
                  this.tutor = tutor;
              }
          
              public void update(CourseRequestDto requestDto) {
                  this.title = requestDto.getTitle();
                  this.tutor = requestDto.getTutor();
              }
          }
        4. Week02Application.java 변경
          @EnableJpaAuditing
          @SpringBootApplication
          public class Week02Application {
          
              public static void main(String[] args) {
                  SpringApplication.run(Week02Application.class, args);
              }
          
              @Bean
              public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
                  return (args) -> {
                      courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
          
                      System.out.println("데이터 인쇄");
                      List<Course> courseList = courseRepository.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());
                      }
          
                      CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
                      courseService.update(1L, requestDto);
                      courseList = courseRepository.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());
                      }
          
                      courseRepository.deleteAll();
                  };
              }
          }

    • JPA
      : SQL을 사용하지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기
      🥲JPA가 없다면🥲
      JAVA 짜다가 SQL 짜고, 그걸 잘 맞춰 넣어야해서 매우 복잡
      • Domain - Table, Repository - SQL 로 생각하면 됨

     

    • H2를 이용해 테이블을 생성했던 것을 JAVA로 표현한다면?
      1. src > main > java > com.sparta.week02 에 domain 패키지 생성
      2. Course.java 파일 생성
        @NoArgsConstructor // 기본생성자 대신 생성
        @Entity // 테이블임을 나타냄
        public class Course {
        
            @Id // ID 값, Primary Key로 사용하겠다는 뜻
            @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령
            private Long id;
        
            @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함
            private String title;
        
            @Column(nullable = false)
            private String tutor;
            
            public Long getId() {
            	return this.id;
            }
            
            public String getTitle() {
                return this.title;
            }
        
            public String getTutor() {
                return this.tutor;
            }
        
            public Course(String title, String tutor) {
                this.title = title;
                this.tutor = tutor;
            }
        }
      3. CourseRepository.java 인터페이스 생성
        public interface CourseRepository extends JpaRepository<Course, Long> { 
        // Course의 Id는 Long타입
        }
        • Interface
          : Class에서 member가 빠진, method 모음집
          ‼️JPA는 Repository를 통해서만 사용 가능

      4. SQL이 보이도록 application.properties 세팅
        spring.jpa.show-sql=true
        spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL
      5. main 함수 아래에 JPA 실행 코드 추가
        @Bean
        public CommandLineRunner demo(CourseRepository repository) {
            return (args) -> {
        
            };
        }
    • 상속
      : extends - 클래스의 상속이미 만들어둔 걸 가져다 쓴다고 선언하는 것
      • Timestamped
        DB의 기본은 "생성일자"와 "수정일자"를 필드로 가지는 것
        • Timestamped.java 생성
          @MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
          @EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
          public class Timestamped {
          
              @CreatedDate // 생성일자임을 나타냅니다.
              private LocalDateTime createdAt;
          
              @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
              private LocalDateTime modifiedAt;
          }
        • Course.javaextends 추가
          class Course extends Timestamped {
        • Week02Application.java@EnableJpaAuditing 추가
          @EnableJpaAuditing // 생성일자, 수정일자 자동으로 업데이트
          @SpringBootApplication
          public class Week02Application {
        • http://localhost:8080/h2-console 접속해서 확인
          SELECT * FROM course;
    • JPA 심화
      • CRUD: 정보관리의 기본 기능으로 Create(생성), Read(조회), Update(변경), Delete(삭제)을 뜻함 
      • Create & Read
        : Repository의 savefindAll 등 이용(main 함수에 작성)
        repository.save(new Course("Spring", "곽두필"));
        
        // 데이터 전부 조회하기(Read)
        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());
        }
        
        // 데이터 하나 조회하기(Read)
        Course course = repository.findById(1L).orElseThrow(
            () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
      • Service
        ➡️ Update와 Delete 전에 다루어야 하는 개념
        • 스프링의 구조
          1. Controller: 가장 바깥 부분, 요청/응답 처리
          2. Service: 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
          3. Repo: 가장 안쪽 부분, DB와 맞닿아 있음(Repository, Entity)
        • Service 만들기
          1. Course.javaupdate 추가
            public void update(Course course) {
                this.title = course.title;
                this.tutor = course.tutor;
            }
          2. src > main > java > com.sparta.week02 > service 패키지 생성
          3. CourseService.java 생성
            @Service // 스프링에게 이 클래스는 서비스임을 명시
            public class CourseService {
            
            		// final: 서비스에게 꼭 필요한 녀석임을 명시
                private final CourseRepository courseRepository;
            
            		// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
            		// 스프링에게 알려줌
                public CourseService(CourseRepository courseRepository) {
                    this.courseRepository = courseRepository;
                }
            
                @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
                public Long update(Long id, Course course) {
                    Course course1 = courseRepository.findById(id).orElseThrow(
                            () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
                    );
                    course1.update(course);
                    return course1.getId();
                }
            }
      • Update & Delete (main 함수에 작성)
        @Bean
        public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
            return (args) -> {
                courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
        
                System.out.println("데이터 인쇄");
                List<Course> courseList = courseRepository.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());
                }
        		
                // Update
                Course new_course = new Course("웹개발의 봄, Spring", "임민영");
                courseService.update(1L, new_course);
                courseList = courseRepository.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());
                }
        		
                // Delete
                courseRepository.deleteAll();
            };
        }

    'Spring' 카테고리의 다른 글

    [Spring] API  (0) 2024.07.18
    [Spring] Lombok, DTO  (0) 2024.07.17
    [Spring] RDBMS , H2, SQL  (0) 2024.07.17
    [IntelliJ] GitHub 연동 및 프로젝트 업로드  (0) 2024.07.09
    [IntelliJ] 실행 오류  (0) 2024.07.09

    • RDBMS(Relational DataBase Management System)
      : 컴퓨터에 정보를 저장하고 관리하는 기술
      • 종류
        • MySQL
          : spring과 궁합이 좋음
        • PostgreSQL
        • Oracle Database
        • H2
          : In-memory DB의 대표 주자
          In-memory DB: 서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스
    • H2 웹콘솔 띄워보기
      1. src > main > resources > application.properties 파일 열기
      2. h2 웹콘솔 설정 추가
        spring.h2.console.enabled=true
        spring.datasource.url=jdbc:h2:mem:testdb
      3. java 파일 Run
      4. http://localhost:8080/h2-console 접속
        • Connect 버튼 클릭
        • 아래와 같은 화면이 뜨면 성공
    • SQL 기초
      • Structured Query Language 
      • 테이블 생성
        CREATE TABLE IF NOT EXISTS courses (
            id bigint NOT NULL AUTO_INCREMENT, 
            title varchar(255) NOT NULL,
            tutor varchar(255) NOT NULL,
            PRIMARY KEY (id)
        );
         
      • 데이터 삽입
        INSERT INTO courses (title, tutor) VALUES
            ('Spring', '곽두팔'), ('Spring2', '이두식');
      • 데이터 조회
        SELECT * FROM courses;
      • ‼️웹서비스를 만들기 위해 SQL 모두 배울 필요 X‼️
        ➡️ Spring Data JPA: 명령을 내린 JAVA 명령어를 SQL로 번역

    'Spring' 카테고리의 다른 글

    [Spring] Lombok, DTO  (0) 2024.07.17
    [Spring] JPA, CRUD  (0) 2024.07.17
    [IntelliJ] GitHub 연동 및 프로젝트 업로드  (0) 2024.07.09
    [IntelliJ] 실행 오류  (0) 2024.07.09
    [Spring] JAVA 기초 문법(2), Controller, Gradle  (0) 2024.07.05

    Spring 공부 내용을 GitHub에 업로드하면서 진행하고 싶었다.

    GitHub 연동 과정에서 이런저런.. 오류를 잔뜩 얻었지만

    여차저차 업로드는 성공했기 때문에 글을 써보려고 한다.

     

    • GitHub 계정 연동하기

     

    • Preferences > GitHub > Login In via GitHub 클릭 후 계정 연동
      연동이 정상적으로 성공하면 위 화면에 GitHub 프로필이 생성됨

     

    • GitHub에 Java 프로젝트 업로드(Share)

     

    • Git > GitHub > Share Project on GitHub

     

    • Repository name, Description 작성 후 Share
      (Share by: 에 Github 계정 제대로 연동되어 있는지 확인)

    성공 메세지

    • 성공적으로 Repository 생성 완료!

     

    'Spring' 카테고리의 다른 글

    [Spring] JPA, CRUD  (0) 2024.07.17
    [Spring] RDBMS , H2, SQL  (0) 2024.07.17
    [IntelliJ] 실행 오류  (0) 2024.07.09
    [Spring] JAVA 기초 문법(2), Controller, Gradle  (0) 2024.07.05
    [Spring] JAVA 기초 문법(1)  (0) 2024.07.05

    IntelliJ 업데이트 했더니 갑자기 실행이 안됨

    이렇게 아이콘에 금지딱지도 붙고

    클릭하면 프로그램을 열 수 없다고...

     

    그래서 열심히 방법을 찾아봤는데

    아이콘에 금지딱지 없애는 법도 못찾고...

    아이콘 클릭해서 바로 실행되게 하는 법도 못찾았지만...

     

    인텔리제이 실행시키기는 성공...

    어찌저찌 일단 실행이 되긴하니... 해결책을 찾을 때까진 이 방법으로 실행시키겠다...

     

    우클릭해서 "패키지 내용 보기" 클릭

     

    Contents > MacOS > idea 클릭

    그러면 실행은 됩니다...^^

    이유가 무엇일까

    • 객체지향 프로그래밍
      • 조금 더 현실 세계에 빗대어 체계적으로 해보자는 발상이 객체지향 프로그래밍의 핵심
    •  Class(클래스)
      • 현실과 비슷한 개념(객체)을 나타내기 위한 자바의 도구
      • 클래스 내 정보를 멤버 변수라고 함
      • 생성자
          • 클래스명과 똑같은 이름을 가진 메소드
          • 클래스 변수를 새롭게 만들 때 사용
          • 기본생성자: 아무런 파라미터가 없는 생성자
        // Course.java
        public class Course {
            public String title;
            public String tutor;
            public int days;
        
        	// 기본생성자
            public Course() {
        
            }
        	// 생성자
            public Course(String title, String tutor, int days) {
                this.title = title;
                this.tutor = tutor;
                this.days = days;
            }
        }
        
        // Prac.java
        Course course = new Course();
        course.title = "Spring";
        • 빵틀(Course), 빵(course)
        • this(클래스 변수)라고 표시함으로써 빵틀 전체의 값을 바꾸는 게 아니라 빵 하나의 값만 바꾸는 것!
    • private / public
      • 클래스는 민감한 정보들도 담고 있기 때문에 모든 정보를 손쉽게 바꿀 수 있으면 안됨
      • 밖에서 드러내도 되는 것: public / 함부로 바꾸면 안되는 것: private
    • Getter / Setter
      • Getter: 정보를 가져오는 메소드 / Setter: 정보를 바꾸는 메소드
        /* Getter, Setter 만들기 */
        // Getter
        public String getTitle() {
        	return this.title;
        }
        
        // Getter
        public String getTutor() {
        	return this.tutor;
        }
        
        // Getter
        public int getDays() {
        	return this.days;
        }
        
        // Setter
        public void setTitle(String title) {
        	this.title = title;
        }
        
        // Setter
        public void setTutor(String tutor) {
        	this.tutor = tutor;
        }
        
        // Setter
        public void setDays(int days) {
        	this.days = days;
        }
        /* Getter, Setter 사용하기 */
        Course course = new Course();
        
        System.out.println(course.getTitle());
        System.out.println(course.getTutor());
        System.out.println(course.getDays());
        
        course.setTitle("Spring");
        course.setTutor("tom");
        course.setDays(7);
        
        System.out.println(course.getTitle());
        System.out.println(course.getTutor());
        System.out.println(course.getDays());
        public Class Tutor() {
        	// 멤버 변수
            private String name;
            private int bio;
            
            // 기본 생성자
            public Tutor() {
            
            }
            
            // 생성자
            public Tutor(String name, int bio) {
            	this.name = name;
                this.bio = bio;
            }
            
            // Getter
            public String getName() {
            	return this.name;
            }
            public int getBio() {
            	return this.bio;
            }
            
            // Setter
            public void setName(String name) {
            	this.name = name;
            }
            public void setBio(int Bio) {
            	this.bio = bio;
            }
        }
    • 브라우저에 나타내기
      • 데이터로 응답하려면, RestController 사용
      • Rest
        • 서버의 응답이 JSON 형식임을 나타냄
        • HTML, CSS 등을 주고받을 때는 Rest 붙이지 않음
      • Controller
        • 클라이언트의 요청(Request)을 전달받는 코드
        • JSON 만을 돌려주는 것: RestController
    • RestController 만들기
      • src > main > com.sparta.week01 에 controller 패키지 생성
      • CourseController.java 파일 생성
        public class CourseController {
            @GetMapping("/courses")
            public Course getCourse() {
                Course cousre = new Course();
                course.setTitle("Spring");
                course.setDays(7);
                course.setTutor("Tom");
                return course;
            }
        }
        • @GetMapping
          • GET 방식: 브라우저에서 주소를 치는 행위로 정보를 요청
          • 스프링 주소(http://localhost:8080) 뒤의 주소가 /courses 일 경우, getCourse 메소드를 실행함을 나타냄
    • Gradle
      • 오픈소스 빌드 도구
      • 추가하기
        • Maven Repository에서 원하는 라이브러리 찾기
        • build.gradle에 원하는 프로젝트 파일 넣기
        • dependencies 옆 Run 버튼 클릭
        • 우측 Gradle 탭의 새로고침 버튼 클릭
        • 대상 프로젝트가 추가된 것 확인

    'Spring' 카테고리의 다른 글

    [IntelliJ] GitHub 연동 및 프로젝트 업로드  (0) 2024.07.09
    [IntelliJ] 실행 오류  (0) 2024.07.09
    [Spring] JAVA 기초 문법(1)  (0) 2024.07.05
    [Spring] 스프링 작동시키기  (0) 2024.07.05
    [Spring] 웹의 기본 개념  (0) 2024.07.05

    + Recent posts