백엔드 88

JPQL 예제 실습 - @Query

◉ @Query ▪︎ JPA에서 직접 쿼리를 작성할 수 있게 해주는 애너테이션 ▪︎ JPA가 쿼리를 자동으로 생성해주지만, 상황에 따라 직접 쿼리를 작성할 필요가 생기기도 함 - 이럴 경우를 대비해, JPA에서 직접 쿼리를 작성할 수 있는 방법에 대해 알아보자 ◉ JPA에서 직접 쿼리 작성하는 방법 1. JPQL로 작성 2. 일반 SQL로 작성 ▪︎ JPQL : JPA의 일부분으로 정의된 플랫폼 독립적인 객체지향 쿼리 언어 일반 SQL : 데이터베이스를 보고 작성 / JPQL : 엔티티 클래스를 보고 작성 ▪︎ JPQL과 SQL 모두 직접 쿼리를 작성하는 방법은 동일하게 @Query 어노테이션 이용 - @Query 어노테이션의 nativeQuery 속성 이용하여 JPQL로 작성할지, SQL로 작성할지 결..

모던 웹 애플리케이션 개발 - 3. JPA를 이용한 데이터베이스 생성 및 접근 (2)

6. 스프링 데이터 리포지터리에 쿼리 정의 - 쿼리 접두사 ( 예 : findBy )로 시작하고, 그 다음 쿼리에 이용할 엔티티 클래스 필드가 나와야 함 ▪︎ CarRepository 인터페이스 생성 ① 단일 조건으로 검색 public interface CarRepository extends CrudRepository{ // * // 단, PK 데이터 타입은 wrapper 클래스명으로 넘겨주어야 함 // ( long이 아닌 Long ) // * JPA에서는 일반적인 검색은 직접 구현하지 않음. 여기서는 선언만 함. // * 스프링 데이터 리포지토리에 다음 쿼리 정의 // 1. 단일 조건으로 검색 // 브랜드로 자동차 검색 List findByBrand(Str..

모던 웹 애플리케이션 개발 - 3. JPA를 이용한 데이터베이스 생성 및 접근 (1)

◉ 엔티티 클래스 생성 ▪︎ 엔티티 클래스 - JPA의 @Entity 어노테이션을 사용하는 자바 클래스 1. JPA와 H2 데이터베이스를 이용하기 위해 pom.xml 파일에 다음의 의존성 추가해야 함 - 라이브러리 추가 시, Gradle과 같이 업데이트 해주어야 함 ① pom.xml에서 오른쪽 클릭 - Maven - Update Project 클릭 ② 업데이트할 프로젝트 선택 : 현재 프로젝트 선택 2. domain 패키지에 Car 클래스 생성 @Entity public class Car { @Id @GeneratedValue(strategy = GenerationType.AUTO) // DB 종류에 따라 JPA가 기본키를 자동으로 생성함 private long id; private String bran..

모던 웹 애플리케이션 개발 - 1. 환경과 툴 설정

◉ IDE 특징 - IntelliJ : 스프링 이니셜라이저 이용(spring.io)해서 프로젝트 생성 후. import - STS : 스프링 이니셜라이저 기능 내장되어 있음 - Apache Maven 소프트웨어 개발 프로세스를 간소화하는 소프트웨어 프로젝트 관리 툴이며, 개발 프로세스를 통합하는 기능 제공 ◉ 스프링 이니셜라이저 활용해 maven project 생성 1. 프로젝트 만들기 • Packaging name = Group명.Artifact명 • JSP : War 사용 권장 타임리프 : Jar 사용 권장 • 의존성 추가 - Spring Web / Lombok / Spring Boot Dev Tools • Generate - 압축파일 생성 • 압축파일 압축 푼 후, app/java 아래로 옮기기 2..

Git

◉ Git Branch 생성 git branch 브랜치명 - “hello-world-images”라는 이름의 새로운 branch 확인 가능 현재 * master에 있음 ( * : 주 작업 브랜치를 의미 ) - "hello-world-css" 브랜치 하나 더 생성 ◉ Git checkout ◉ Emergency Branch -b 없으면 만들어라 수정된 index.html를 스테이징 환경에 올린 후, 커밋 진행 master로 옮긴 후, emergency-fix와 병합시키기 브랜치 삭제 후 git 상태 조회 -d : 지정한 브랜치 삭제

Git - 설치 / 폴더 생성 / 초기화 / 새 파일 추가 / Staging Environment / Commit

◉ Git이란? - 코드 저장소 - 이력을 관리하는 저장소 - Version Control System ( history - 날짜 등 으로 구분 가능 ) - Code를 저장 및 저장지점으로 되돌아갈 수 있도록 해주는 시스템 - 분산 버전 관리 시스템 : 여러 개발 PC와 저장소에 분산해서 저장 ◉ GitHub란? - 코드 저장소(Git)을 웹에 옮겨 놓은 원격저장소 ▪︎ 웹에 있을 때의 장점 : 공유 가능 (협업), 코드 복구 가능 ◉ 분산 버전 관리 - 버전 관리 : 파일 변화를 시간에 따라 기록했다 특정 시점의 버전으로 다시 가져올 수 있는 것 ▪︎ 장점 ① 소스 코드가 변경된 이력 쉽게 확인 가능 ② 특정 시점에 저장된 버전과 비교 가능 ③ 특정 시점으로 되돌아갈 수 있음 ④ 내가 올리려는 파일이 ..

6. 블로그 기획하고 API 만들기 흐름 요약

1. 데이터베이스에서 테이블 구조와 매핑될 엔티티 구성 - src/main/java/domain → Article.java - @Entity 애너테이션 사용 2. 레포지터리 생성 - src/main/java/repository → BlogRepository.java - 인터페이스로, JpaRepository 상속받아 JPA에서 제공하는 메서드 이용 - 상속 받을 때, 인수로 지정해야 함 3. 글 작성 API 구현 1) 컨트롤러로부터 서비스 계층에서 요청받을 객체 생성 - src/main/java/dto → AddArticleRequest.java 2) 서비스 - src/main/java/service → BlogService.java - save() 메서드 추가 •..

Maven Project를 Gradle Project로 변경하기

1. Maven Project 폴더를 원하는 경로(/app/spring)에 위치시키기 2. 외부 파일인 Maven Project를 import하기 ① 이클립스의 상단 File - Import - Existing Maven Projects 선택 ② Browse 클릭 - 다운로드된 폴더를 찾아 경로 지정 후, Finish 클릭 ③ Package Explorer 창에서 확인 가능 → Maven Project의 설정 파일 : pom.xml 3. Gradle 설치 ( 맥북 ) ① 터미널창 이용해 자동으로 다운로드 받기 brew install gradle ② 설치 완료가 되면, 다운로드 받은 gradle 버전 확인 gradle -v ③ init 명령어를 이용해 gradle 초기화시킴 gradle init • mav..

7. 블로그 화면 구성하기 (5) - 수정 / 생성 기능 추가

5. 수정 / 생성 뷰 컨트롤러 작성하기 - 보통 블로그 글 수정과 생성은 같은 화면에서 진행됨 - 수정 / 생성에 따라 버튼 다르고, 기존 값의 유무가 다름 → URL의 설계와 흐름 또한 다름 ❶ 이미 생성한 글을 수정할 때 /new-article?id=123 123 id를 가진 사용자 -------------------------> 뷰 컨트롤러 -------------------------> 뷰 ( id가 123인 글 수정 ) 엔티티 조회 후 모델에 추가 ❷ 새 글을 생성할 때 /new-article 사용자 -------------------------> 뷰 컨트롤러 -------------------------> 뷰 (생성) • 쿼리 파라미터 : HTTP 요청에서 URL의 끝에 '?'로 시작하는 키..

7. 블로그 화면 구성하기 (4) - 삭제 기능 추가

◎ 글 상세 화면에서 [ 삭제 ] 버튼 클릭 시, 글을 삭제해보자. 삭제 API로 요청을 보낼 코드를 작성하고 테스트해보자 1. 삭제 기능 코드 작성 - 삭제 코드는 자바스크립트로 작성 ▪︎ article.js ( src/main/resources/static 디렉터리) // * 삭제 버튼이 눌러졌으면 그 삭제 버튼의 이벤트 등록 // HTML에서 id를 'delete-btn'으로 설정한 엘리멘트를 찾아 상수로 선언 const deleteButton = document.getElementById('delete-btn') // deleteButton이 있는 경우 if (deleteButton) { // 그 엘리멘트에 클릭 이벤트를 발생하면 fetch() 메서드를 통해 // '/api/articles/DEL..