D+56-spring.검색기능구현,DB접근,필요한 라이브러리,여러가지 어노테이션

Bku·2024년 3월 21일

학원 일기

목록 보기
55/67
post-thumbnail

검색 기능 만들기

이건 수업시간에서 하라고 한 것은 아니지만 그냥 만들어보고 싶어서 만들어 봤다.이렇게 검색창에 id를 입력하면 해당의 id의 게시판 정보를 불러오게 만들어 보았다.

service함수

이 기능은 id로 해당 id의 정보를 찾는 것이므로 미리 만들어 놓은 findById함수를 사용할 것이다.

  public Board findById(int id){
         Board board= boardDao.selectById(id);
         return board;
    }

cotroller 함수 만들기

부트스트랩의 검색창을 만들었는데 이 검색창은 입력받은 값을 url에 "?변수=입력받은값"형태로 전달된다. 그래서 @RequestParam을 이용해서 controller를 만들었다.

   @GetMapping("/board/search")
    public String getSearchById(Model model, @RequestParam int id) {
        Board board = boardService.findById(id);
        model.addAttribute("board", board);
        return "/exam01/board/board_by_eno.jsp";
    }

Board타입 변수에 findById(id)를 담아서 model로 jsp에 내보낸다. 그리고 jsp는 사용중이던 board_by_eno를 사용했다.

검색창 HTML

검색창은 header_board라는 jsp에 만들어 두었다.

<form class="d-flex" role="search" action="/exam01/board/search" method="get">
                <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search" name="id">
                <button class="btn btn-outline-secondary" type="submit">Search</button>
            </form>

밑줄 친 부분이 내가 추가를 해 준 부분이다.

  1. action으로 controller의 함수가 실행 될 수 있도로 url을 넣어주어야한다. getSearchById함수의 GetMappiing의 url을 넣어주었다.

  2. 데이터를 조회하는 것이므로 method는 get이된다.

  3. id로 조회를 할 것이므로 검색창에 입력되는 정보가 java에서 어떤 속성을 의미하는 지를 name속성에 적어주어야하낟.

  4. 이건 부트스트랩에서 가져올때부터 있었지만 button에 type의 submit으로 해주어야 값이 전송된다.

이렇게 하면 검색창을 이용해 id로 데이터를 조회할 수 있게 된다.

데이터 베이스와 스프링 접속

라이브러리 가져오기

이번에 jpa를 이용해서 sql을 연결할 것이라서 jpa와 oracle라이브러리를 가져와야한다. 프로젝트 생성시 이 두개를 추가로 체크해주면된다.
jpa와 DB 라이브러리가 생성되었다.

DB및 JPA속성 가져오기

최종 라이브러리

dependencies {

    //    jsp 라이브러리 추가
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' // 추가
    implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상
    implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' //스프링부트 3.0 이상
    implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상

//    sql 출력 결과를 보기위한 라이브러리 추가
    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

//    오라클 driver (과거: 11버전) -> 19버전용 라이브러리 추가 설치
//  todo: 오라클 라이브러리( 19c )
    implementation 'com.oracle.database.jdbc:ucp:19.14.0.0'
    implementation 'com.oracle.database.security:oraclepki:19.14.0.0'
    implementation 'com.oracle.database.security:osdt_cert:19.14.0.0'
    implementation 'com.oracle.database.security:osdt_core:19.14.0.0'

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

추가적으로 19버전용 라이브러리도 가져와야한다.

DB 연결 속성 및 JPA속성 가져오기

# 서버 포트 : 기본포트(8080) -> 8000(변경)
server.port=8000
# jsp 파일 경로 지정 : spring 에 jsp 위치 알려주는 설정
spring.mvc.view.prefix=/WEB-INF/views/
# 자바 소스가 수정되면 서버 자동 재시작을 함
spring.devtools.restart.enabled=true
# todo: PUT , DELETE 방식도 form 태그에서 사용할 수 있게 만들어줌
spring.mvc.hiddenmethod.filter.enabled=true

# TODO: DB 라이브러리 설정 : build.gradle 오라클 db 라이브러리 없으면 에러발생
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# TODO: DB 접속 설정  : 도커 오라클 , 계정/암호, db명(서비스이름)(xepdb1)
# todo: spring.datasource.url=jdbc:log4jdbc:oracle:thin:@ip주소:db포트번호/db이름
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xepdb1
# 계정 정보
spring.datasource.username=scott
# 암호
spring.datasource.password=!Ds1234567890

# TODO: JPA 접속 설정
# JPA : sql 를 자동 생성해주는 프레임워크 :
# => JPA 기본함수만 실행하면 해당되는 sql 문을 만들어줌(자동화기능)
# => JPA 복잡한 sql 문은 개발자 직접 작성하는 기능이 있음 => Querydsl 라이브러리
# vs Mybatis : 모든 sql 을 개발자 직접 작성하는 방식, 대신에 작성시 가독성 높여서 작성가능

# JPA : sql 자동작성 기능 : 1) ddl (테이블생성, 시퀀스 생성등) 생성           : x
#                         2) dml (CRUD:insert/select/update/delete) 생성 : O
# ddl 자동생성 기능 켜기 옵션 : none(끄기), create(켜기), update(없는것만 만들기)
spring.jpa.hibernate.ddl-auto=none
# todo: db 제품 연결 ( oracle 12이상 : Oracle12cDialect )
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect

위의 속성들을 다 넣어주면된다. 그럼 DB가 연결되고 jpa도 사용이 가능하다.

jpa란

기본적인, 간단한(crud) SQL 쿼리문을 기본 함수로 제공하는 기능이다. 그렇지만 복잡한 기능은 SQL로 직접 작성할 수있게 해주는 기능도 있다.

또한 복잡한 기능은 SQL짜기도 복잡하기 때문에 이 또한 Querydsl이라는 라이브러리를 제공한다.

jpa 관련 어노테이션

1. Entity

jpa 프레임워크 사용시 기능을 대상 클래스에 부여하는 어노테이션이다.이걸 사용해야 jpa를 사용할 수 있다.

2. Table

@Table(name="테이블 이름")

위와 같은 방식으로 사용할 수 있다. ddl생성 기능 사용시 위의 테이블 명으로 DB를 생성해주는 어노테이션이다.

속성 설정시 ddl자동생성은 아래와 같이 none으로 꺼놨다. 그래서 사용할 일은 없을것 혹시라도 사용할 일이 생기면 알아놓자.

# ddl 자동생성 기능 켜기 옵션 : none(끄기), create(켜기), update(없는것만 만들기)
spring.jpa.hibernate.ddl-auto=none

3. SequenceGenerator

오라클만 시퀀스 기능을 사용하므로 오라클 사용시 시퀀스를 만들 것이라면 해줘한다.

@SequenceGenerator( //- Oracle DB 시퀀스 생성시 사용할 속성들
        name = "시퀀스_제네레이터이름"
        , sequenceName = "DB시퀀스명"
        , initialValue = 1(초기값)
        , allocationSize = 1(할당값)
)

시퀀스 이름과 DB시퀀스명, 그리고 초기값과 할당값을 줄 수 있다.

4. DynamicInsert, DynamicUpdate

옵션 기능으로 jpa에서 insert, update SQL자동 생성시 null값이 들어오는 컬럼은 제외하고 SQL을 작성해주는 어노테이션이다.

예를 들어

insert int dept (dno, dname, loc)
values(1, 2, NULL)

insert int update (dno, dname, loc)
values(1, 2, NULL)

이런식으로 들어오면 null값을 제외하고 다음과 같이 바꿔버린다.

insert int dept (dno, dname, loc)
values(1, 2)

insert int update (dno, dname, loc)
values(1, 2)

널 에러를 방지하기 위해 사용하기 좋다.

5. Id

기본키를 지정해주는 어노테이션이다. model클래스에서 pk로 할 속성위에 지정해주면된다.

6. GeneratedValue

시퀀스 관련 어노테이션으로 어떤 속성으로 만들것인가를 지정하는 어노테이션이다. 보통 시퀀스는 pk값이라서 pk위에 보통 붙여준다.

@GeneratedValue(strategy = GenerationType.SEQUENCE
            , generator = "시퀀스 제네레이터 이름"
    )

시퀀스를 만들것이므로 strategy는 GenerationType.SEQUENCE로 해주고, 시퀀스 제네레이터 이름을 넣으면 된다.

Column

DB컬럼 자료형을 나타줄때 컬어주는 어노테이션이다. ddl기능을 사용하지 않으면 생략이 가능해서 필수는 아니다.

  @Column(columnDefinition = "VARCHAR2(255)")
    private String  dname; // 부서명

속성위에 자료형을 적어주면된다.

다음에 jpa, jsp, spring으로 새롱운 프로젝트 진행시 이 글을 참고해서 api를 가져오도록하자.

profile
기억보단 기록

0개의 댓글