Rest API Service를 이용한 Angular4 Application Step2.

 

※ 이전 Posting에서 생성한 Rest API Service를 연동할 Angular Aoolication을 작성한다.

2018/04/11 - [개발/Java] - Rest API Service를 이용한 Angular4 Application 작성1

 

1. Angular Project를 생성한다.

- ng new user-app --routing 명령어로 생성(routing 모듈을 기본적으로 생성하는 옵션)

D:\itdev4u\angular>ng new user-app --routing
  create user-app/e2e/app.e2e-spec.ts (290 bytes)
  create user-app/e2e/app.po.ts (208 bytes)
  create user-app/e2e/tsconfig.e2e.json (235 bytes)
  create user-app/karma.conf.js (923 bytes)
  create user-app/package.json (1293 bytes)
  create user-app/protractor.conf.js (722 bytes)
  create user-app/README.md (1023 bytes)
  create user-app/tsconfig.json (363 bytes)
  create user-app/tslint.json (3012 bytes)
  create user-app/.angular-cli.json (1243 bytes)
  create user-app/.editorconfig (245 bytes)
  create user-app/.gitignore (544 bytes)
  create user-app/src/assets/.gitkeep (0 bytes)
  create user-app/src/environments/environment.prod.ts (51 bytes)
  create user-app/src/environments/environment.ts (387 bytes)
  create user-app/src/favicon.ico (5430 bytes)
  create user-app/src/index.html (294 bytes)
  create user-app/src/main.ts (370 bytes)
  create user-app/src/polyfills.ts (3114 bytes)
  create user-app/src/styles.css (80 bytes)
  create user-app/src/test.ts (642 bytes)
  create user-app/src/tsconfig.app.json (211 bytes)
  create user-app/src/tsconfig.spec.json (283 bytes)
  create user-app/src/typings.d.ts (104 bytes)
  create user-app/src/app/app-routing.module.ts (245 bytes)
  create user-app/src/app/app.module.ts (395 bytes)
  create user-app/src/app/app.component.html (1173 bytes)
  create user-app/src/app/app.component.spec.ts (1103 bytes)
  create user-app/src/app/app.component.ts (207 bytes)
  create user-app/src/app/app.component.css (0 bytes)
npm WARN deprecated nodemailer@2.7.2: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/
npm WARN deprecated mailcomposer@4.0.1: This project is unmaintained
npm WARN deprecated socks@1.1.9: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow
and an import issue introduced in 2.1.0
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
npm WARN deprecated buildmail@4.0.1: This project is unmaintained
npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0

> uws@9.14.0 install D:\itdev4u\angular\user-app\node_modules\uws
> node-gyp rebuild > build_log.txt 2>&1 || exit 0


> node-sass@4.8.3 install D:\itdev4u\angular\user-app\node_modules\node-sass
> node scripts/install.js

Cached binary found at C:\Users\lunajin\AppData\Roaming\npm-cache\node-sass\4.8.3\win32-x64-59_binding.node

> uglifyjs-webpack-plugin@0.4.6 postinstall D:\itdev4u\angular\user-app\node_modules\webpack\node_modules\uglifyjs-webpack-plugin
> node lib/post_install.js


> node-sass@4.8.3 postinstall D:\itdev4u\angular\user-app\node_modules\node-sass
> node scripts/build.js

Binary found at D:\itdev4u\angular\user-app\node_modules\node-sass\vendor\win32-x64-59\binding.node
Testing binary
Binary is fine
npm WARN rollback Rolling back ajv@4.11.8 failed (this is probably harmless): EPERM: operation not permitted, lstat 'D:\itdev4u\angular\user-app\node_modules\fsevents\node_modules'
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

added 1259 packages in 150.629s
'git'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
Project 'user-app' successfully created.

 

2. user module을 생성한다.

- ng generate module user --routing 명령어로 생성.

D:\itdev4u\angular\user-app>ng generate module user --routing
  create src/app/user/user-routing.module.ts (247 bytes)
  create src/app/user/user.module.ts (271 bytes)

 

3. Rest API Service를 호출할때 필요한 user service를 생성한다.

- ng generate service user/user 명령어로 user module내에 생성.

D:\itdev4u\angular\user-app>ng generate service user/user
  create src/app/user/user.service.spec.ts (362 bytes)
  create src/app/user/user.service.ts (110 bytes)

 

4. user모듈내에 sub component를 생성한다.

- user-list component : 사용자 목록 관련 component

- user-create component : 사용자 생성/수정 관련 component

- ng generate component user/user-list 명령어로 생성

ng generate component user/user-create 명령어로 생성

D:\itdev4u\angular\user-app>ng generate component user/user-list
  create src/app/user/user-list/user-list.component.html (28 bytes)
  create src/app/user/user-list/user-list.component.spec.ts (643 bytes)
  create src/app/user/user-list/user-list.component.ts (280 bytes)
  create src/app/user/user-list/user-list.component.css (0 bytes)
  update src/app/user/user.module.ts (357 bytes)

D:\itdev4u\angular\user-app>ng generate component user/user-create
  create src/app/user/user-create/user-create.component.html (30 bytes)
  create src/app/user/user-create/user-create.component.spec.ts (657 bytes)
  create src/app/user/user-create/user-create.component.ts (288 bytes)
  create src/app/user/user-create/user-create.component.css (0 bytes)
  update src/app/user/user.module.ts (453 bytes)

 

 

5. Url 기반으로 관련페이지 리다이렉션등의 액션을 위해 user-routing.module.ts 파일을 수정한다.

- src/app/user/user-routing.module.ts 파일 수정.

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { UserListComponent } from './user-list/user-list.component';
import { UserCreateComponent } from './user-create/user-create.component';

const routes: Routes = [
  {path: 'user', component: UserListComponent},
  {path: 'user/create', component: UserCreateComponent},
  {path: 'user/edit/:id', component: UserCreateComponent}
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class UserRoutingModule { }

 

 

6. app.module.ts 파일에 UserModule을 import한다.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { UserModule } from './user/user.module';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    UserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

 

 

7. bootstrap4 project를 추가한다.

- npm install --save bootstrap font-awesome 명령어로 추가.

D:\itdev4u\angular\user-app>npm install --save bootstrap font-awesome
npm WARN bootstrap@4.1.0 requires a peer of jquery@1.9.1 - 3 but none is installed. You must install peer dependencies yourself.
npm WARN bootstrap@4.1.0 requires a peer of popper.js@^1.14.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

+ bootstrap@4.1.0
+ font-awesome@4.7.0
added 2 packages in 32.983s

 

8. bootstrap style을 적용한다.

- src/style.css 파일을 수정.

/* You can add global styles to this file, and also import other style files */
@import "~bootstrap/dist/css/bootstrap.min.css";
@import "~font-awesome/css/font-awesome.css";

 

9. 사용자정보를 표시할 User class를 생성한다.

- src/app/user/user.ts 파일을 생성.

export class User {
    id: number;
    firstname: string;
    lastname: string;
    email: string;

    constructor(id: number, firstname: string, lastname: string, email: string) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
    }
}

 

10.  Rest API와 연동하는 서비스를 수정한다.

- src/app/user/user.service.ts 파일 수정.

import { Injectable } from '@angular/core';
import { User } from './user';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class UserService {
  private apiUrl = 'http://localhost:8080/api';
  constructor(private http: Http) { }

  findAll(): Observable {
    console.log('Start findAll');
    return this.http.get(this.apiUrl + '/users')
      .map((res: Response) => res.json())
      .catch((error: any) => Observable.throw(error.json().error || 'Server error'));
  }

  findById(id: number): Observable {
    return null;
  }

  saveUser(user: User): Observable {
    return null;
  }

  deleteUserById(id: number): Observable {
    return null;
  }

  updateUser(user: User): Observable {
    return null;
  }
}

 

11. 전체사용자를 조회하는 서비스를 호출할 수 있게 user-list.component.ts 파일을 수정한다.

- src/app/user/user-list/user-list.component.ts 파일 수정.

import { Component, OnInit } from '@angular/core';
import { User } from '../user';
import { UserService } from '../user.service';

@Component({
  selector: 'app-user-list',
  templateUrl: './user-list.component.html',
  styleUrls: ['./user-list.component.css'],
  providers: [UserService]
})
export class UserListComponent implements OnInit {
  private users: User[];

  constructor(private userService: UserService) { }

  ngOnInit() {
    this.getAllUsers();
  }

  getAllUsers() {
    this.userService.findAll().subscribe(
      users => {
        this.users = users;
      },
      err => {
        console.log(err);
      }
    );
  }
}

 

12. 전체사용자 목록을 보여주는 template 파일을 수정한다.

- src/app/user/user-list/user-list.component.html 파일을 수정.

<div class="container">
  <div class="row">
    <div class="col">
      <section>
        <header class="header">
          <div class="row">
            <div class="col-md-4">
              <h1>Users</h1>
            </div>
            <div class="col-md-6">
 
            </div>
            <div class="col-md-2">
              <button type="button" class="btn btn-primary" (click)="redirectNewUserPage()">New User</button>
            </div>
          </div>
 
        </header>
      </section>
 
      <section class="main">
 
        <table class="table">
          <thead>
          <tr>
            <th>#</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>email</th>
            <th></th>
          </tr>
          </thead>
          <tbody>
          <tr *ngFor="let user of users">
            <th scope="row">{{user.id}}</th>
            <td>{{user.firstname}}</td>
            <td>{{user.lastname}}</td>
            <td>{{user.email}}</td>
            <td>
              <button type="button" class="btn btn-success" (click)="editUserPage(user)">Edit</button>
              <button type="button" class="btn btn-danger" (click)="deleteUser(user)">Delete</button>
            </td>
          </tr>
 
          </tbody>
        </table>
      </section>
    </div>
  </div>
</div>

 

13. app.module.ts 파일에 HttpModule을 import한다.

- src/app/app.module.ts 파일 수정.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { UserModule } from './user/user.module';
import { HttpModule } from '@angular/http';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    UserModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

 

14. Spring에서 CROS를 활성화하기 위해 Rest API Service의 Controller파일에 설정을 추가한다.

- com.itdev4u.controller.UserController 파일에 @CrossOrigin(origins = http://localhost:4200) 추가.

package com.itdev4u.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.itdev4u.exception.ResourceNotFoundException;
import com.itdev4u.model.User;
import com.itdev4u.repository.UserRepository;

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping("/api")
public class UserController {
	@Autowired UserRepository userRepository;
	
	//Get All User
	@GetMapping("/users")
	public List getAllUsers() {
		return userRepository.findAll();
	}
	
	//Create a new User
	@PostMapping("/user")
	public User createUser(@Valid @RequestBody User user) {
		return userRepository.save(user);
	}
	
	//Get a Single User
	@GetMapping("/user/{id}")
	public User getUserById(@PathVariable(value = "id") Long userId) {
		return userRepository.findById(userId)
				.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
	}
	
	//Update User
	@PutMapping("/user/{id}")
	public User updateUser(@PathVariable(value = "id") Long userId
						, @Valid @RequestBody User userDetail) {
		User user = userRepository.findById(userId)
				.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
		
		user.setFirstname(userDetail.getFirstname());
		user.setLastname(userDetail.getLastname());
		user.setEmail(userDetail.getEmail());
		
		User updateUser = userRepository.save(user);
		
		return updateUser;
	}
	
	//Delete a User
	@DeleteMapping("/user/{id}")
	public ResponseEntity deleteUser(@PathVariable(value = "id") Long userId) {
		User user = userRepository.findById(userId)
				.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
		
		userRepository.delete(user);
		
		return ResponseEntity.ok().build();
	}
}

 

 

 

 

 

Rest API Service를 이용한 Angular4 Application Step1.


※ Angular4에서 사용자 추가, 수정, 삭제하는 Rest API Service를 호출하여 간단한 사용자 관리 Application을 구축한다. 

- Rest API Service 구축부분의 설명은 아래 Posting을 참조하면 된다.

  2018/04/08 - [개발/Java] - [Spring Boot] JPA Restful CRUD API Sample1 

 

1. 사용자 정보를 저장할 Table / Sequence를 생성한다.

/* TABLE 생성 */
CREATE TABLE TB_USER 
(
  ID NUMBER NOT NULL 
, FIRSTNAME VARCHAR2(20) NOT NULL 
, LASTNAME VARCHAR2(20) NOT NULL 
, EMAIL VARCHAR2(50) 
, CONSTRAINT TB_USER_PK PRIMARY KEY (ID)
  ENABLE 
);

COMMENT ON COLUMN TB_USER IS '사용자관리 테이블';
COMMENT ON COLUMN TB_USER.ID IS 'Primary Key : SEQUENCE_USER 값을 사용';
COMMENT ON COLUMN TB_USER.FIRSTNAME IS 'first name';
COMMENT ON COLUMN TB_USER.LASTNAME IS 'last name';
COMMENT ON COLUMN TB_USER.EMAIL IS 'email';

/* SEQUENCE 생성 */
CREATE SEQUENCE SEQUENCE_USER INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1;

 

2. Eclipse에서 Spring Start Project를 선택해서 신규 Project를 생성한다. Project의 설정값은 아래와 같이 설정한다.

- Name : UserMgmtService

- Type : Maven

- Packaging : jar

- Group : com.itdev4u

- Artifact : UserMgmtService

- Package : com.itdev4u

- Dependencies : Web, JPA, DevTools

 

3. DataBase와 Mapping할 Entity class 생성한다.

package com.itdev4u.model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;

@Entity
@Table(name="TB_USER")
public class User implements Serializable {
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="user_seq")
	@SequenceGenerator(sequenceName="sequence_user", allocationSize=1, name="user_seq")
	private Long id;
	
	@NotBlank
	private String firstname;
	
	@NotBlank
	private String lastname;
	
	@NotBlank
	private String email;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}	
}

 

4. User 데이터에 Access하는 Repository Interface를 작성한다.

package com.itdev4u.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.itdev4u.model.User;

public interface UserRepository extends JpaRepository<User, Long> {

}

 

5. 사용자정의 Exception class를 작성한다.

package com.itdev4u.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
	private String resourceName;
	private String fieldName;
	private Object fieldValue;
	
	public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
		super(String.format("%s not foumdwith $s : '%s'", resourceName, fieldName, fieldValue));
		this.resourceName = resourceName;
		this.fieldName = fieldName;
		this.fieldValue = fieldValue;
	}

	public void setResourceName(String resourceName) {
		this.resourceName = resourceName;
	}

	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}

	public void setFieldValue(Object fieldValue) {
		this.fieldValue = fieldValue;
	}
}

 

6. API Service 호출시 해당 작업을 담당할 controller class를 작성한다.

package com.itdev4u.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.itdev4u.exception.ResourceNotFoundException;
import com.itdev4u.model.User;
import com.itdev4u.repository.UserRepository;

@RestController
@RequestMapping("/api")
public class UserController {
	@Autowired UserRepository userRepository;
	
	//Get All User
	@GetMapping("/users")
	public List getAllUsers() {
		return userRepository.findAll();
	}
	
	//Create a new User
	@PostMapping("/user/")
	public User createUser(@Valid @RequestBody User user) {
		return userRepository.save(user);
	}
	
	//Get a Single User
	@GetMapping("/user/{id}")
	public User getUserById(@PathVariable(value = "id") Long userId) {
		return userRepository.findById(userId)
			.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
	}
	
	//Update User
	@PutMapping("/user/{id}")
	public User updateUser(@PathVariable(value = "id") Long userId
			, @Valid @RequestBody User userDetail) {
		User user = userRepository.findById(userId)
			.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
		
		user.setFirstname(userDetail.getFirstname());
		user.setLastname(userDetail.getLastname());
		user.setEmail(userDetail.getEmail());
		
		User updateUser = userRepository.save(user);
		
		return updateUser;
	}
	
	//Delete a User
	@DeleteMapping("/user/{id}")
	public ResponseEntity<?> deleteUser(@PathVariable(value = "id") Long userId) {
		User user = userRepository.findById(userId)
			.orElseThrow(()->new ResourceNotFoundException("User", "id", userId));
		userRepository.delete(user);
		return ResponseEntity.ok().build();
	}
}

 

7. Client Tool을 이용해서 API Service 가 정상으로 작동하는지 Test한다.

- Test 결과 생략

Spring Boot, JPA, Oracle, Restful CRUD API 서비스 구축2


※ Restful Service를 Oracle DataBase를 이용해서 구축하는 예제를 2회에 나눠서 Posting한다.

2018/04/08 - [개발/Java] - [Spring Boot] JPA Restful CRUD API Sample1


1. Note 데이터에 Access하는 Repository 생성한다.

package com.itdev4u.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.itdev4u.model.Note;

public interface NoteRepository extends JpaRepository<Note, Long> {

}


2. 사용자 정의 Exception class를 작성한다.

package com.itdev4u.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
import lombok.Getter;

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
	private String resourceName;
	private String fieldName;
	private Object fieldValue;
	
	public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
		super(String.format("%s not foumdwith $s : '%s'", resourceName, fieldName, fieldValue));
		this.resourceName = resourceName;
		this.fieldName = fieldName;
		this.fieldValue = fieldValue;
	}
	
	public String getResourceName() {
		return resourceName;
	}

	public void setResourceName(String resourceName) {
		this.resourceName = resourceName;
	}

	public String getFieldName() {
		return fieldName;
	}

	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}

	public Object getFieldValue() {
		return fieldValue;
	}

	public void setFieldValue(Object fieldValue) {
		this.fieldValue = fieldValue;
	}
}


3. controller 생성한다.

- @GetMapping("/notes") 어노테이션은 @RequestMapping(value="/notes", method=RequestMethod.GET)와 동일하다.

- @PostMapping("/notes") 어노테이션은 @RequestMapping(value="/notes", method=RequestMethod.POST)와 동일하다.

package com.itdev4u.controller; import java.util.List; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.itdev4u.exception.ResourceNotFoundException; import com.itdev4u.model.Note; import com.itdev4u.repository.NoteRepository; @RestController @RequestMapping("/api") public class NoteController { @Autowired NoteRepository noteRepository; // Get All Notes @GetMapping("notes") public List<Note> getAllNotes() { return noteRepository.findAll(); } // Create a new Note @PostMapping("notes") public Note createNote(@Valid @RequestBody Note note) { return noteRepository.save(note); } // Get a Single Note @GetMapping("/notes/{id}") public Note getNoteById(@PathVariable(value = "id") Long noteId) { return noteRepository.findById(noteId) .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); } // Update a Note @PutMapping("/notes/{id}") public Note updateNote(@PathVariable(value = "id") Long noteId , @Valid @RequestBody Note noteDetails) { Note note = noteRepository.findById(noteId) .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); note.setTitle(noteDetails.getTitle()); note.setContent(noteDetails.getContent()); Note updateNote = noteRepository.save(note); return updateNote; } // Delete a Note @DeleteMapping("/notes/{id}") public ResponseEntity<?> deleteNote(@PathVariable(value = "id") Long noteId) { Note note = noteRepository.findById(noteId) .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); noteRepository.delete(note); return ResponseEntity.ok().build(); } }


4. Postman Tool을 이용하여 API Serivce를 Test한다.

- POST /api/notes API Test (생성)

- GET /api/notes API Test (전체조회)

- GET /api/notes/{noteId} API Test (단건조회)

- PUT /api/notes/{noteId} API Test (Update)

- DELETE /api/notes/{noteId} API Test (단건삭제)


Spring Boot, JPA, Oracle, Restful CRUD API 서비스 구축1


※ Restful Service를 Oracle DataBase를 이용해서 구축하는 예제를 2회에 나눠서 Posting한다.

2018/04/09 - [개발/Java] - [Spring Boot] JPA Restful CRUD API Sample2


1. Eclipse에서 Spring Start Project를 선택해서 신규 Project를 생성한다. Project의 설정값은 아래와 같이 설정한다.

- Name : easy-notes

- Type : Maven

- Packaging : jar

- Group : com.itdev4u

- Artifact : easy-notes

- Package : com.itdev4u

- Dependencies : Web, JPA, DevTools


2. 생성된 Project의 디렉토리 구조는 아래 그림과 같이 생성된다.


3. 각 파일 및 디렉토리의 역활은 아래와 같다.

3-1. EasyNotesApplication.java : Spring Boot Project의 시작점이 되는 class이다.

3-2. resources : 정적 resource, 템플릿 등록정보등을 저장하는 디렉토리이다.

- resources/static : css, js, image등의 정적 resource파일을 저장하는 디렉토리이다.

- resources/templates : Spring에서 렌더링되는 서버측 템플릿 파일을 저장하는 디렉토리이다.

- resources/application.properties : Application의 전역속성을 포함한다. Spring은 이 파일에 정의된 속성을 읽은 후 Application을 설정한다.

- pom.xml : Project 에 필요한 Package 정보를 저장한다.


4. com.itdev4u.EasyNotesApplication.java 파일은 아래와 같다.
- @SpringBootApplication 어노테이션이 이 파일이 Spring Boot Project의 시작점이라는것을 지정한다.

package com.itdev4u;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EasyNotesApplication {

	public static void main(String[] args) {
		SpringApplication.run(EasyNotesApplication.class, args);
	}
}



5. pom.xml 파일은 아래와 같다.
- Oracle은 별도로 Project 우클릭 > Import > Maven > Install or deploy an artifact to Maven repository 메뉴에서 등록을 함.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.itdev4u</groupId>
	<artifactId>easy-notes</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>easy-notes</name>
	<description>Rest Api JPA Test</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- Oracle 설정 -->	
		<!-- Oracle은  Install local repository 설정으로 import함 -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>



6. resources/application.properties 파일에 Oracle정보와 Application에 필요한 정보를 작성한다.

#Oracle DataBase spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl spring.datasource.username=scott spring.datasource.password=password spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver # Allows Hibernate to generate SQL optimized for a particular DBMS spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect #Create and Drop tables, sequences... spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true


7. Oracle 에 Table 및 key값으로 사용될 Sequence를 생성한다.

/* Table 생성 */
CREATE TABLE NOTES 
(
  ID NUMBER NOT NULL 
, TITLE VARCHAR2(200) NOT NULL 
, CONTENT VARCHAR2(4000) NOT NULL 
, CREATEDAT TIMESTAMP 
, UPDATEDAT TIMESTAMP 
, CONSTRAINT NOTES_PK PRIMARY KEY (ID) ENABLE 
);

COMMENT ON COLUMN NOTES.ID IS 'Primary Key : Sequence';
COMMENT ON COLUMN NOTES.TITLE IS '제목';
COMMENT ON COLUMN NOTES.CONTENT IS '내용';
COMMENT ON COLUMN NOTES.CREATEDAT IS '생성일';
COMMENT ON COLUMN NOTES.UPDATEDAT IS '수정일';

/* Sequence 생성 */
CREATE SEQUENCE SEQUENCE_NOTES INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 MINVALUE 1;


8. Spring에서 DataBase와 매핑할 Entity class를 생성한다.

- com.itdev4u.model.Note.java 파일을 생성한 후 아래와 같이 작성한다.

package com.itdev4u.model;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotBlank;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name="NOTES")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
public class Note implements Serializable {
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "notes_seq")
	@SequenceGenerator(sequenceName = "sequence_notes", allocationSize = 1, name="notes_seq")
	private Long id;
	
	@NotBlank
	private String title;
	
	@NotBlank
	private String content;
	
	
	@Column(nullable = false, updatable = false)
	//@Temporal(TemporalType.TIMESTAMP)
	@CreatedDate
	private Timestamp createdat;
	
	@Column(nullable = false, updatable = false)
	//@Temporal(TemporalType.TIMESTAMP)
	@LastModifiedDate
	private Timestamp updatedat;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Timestamp getCreatedat() {
		return createdat;
	}

	public void setCreatedat(Timestamp createdat) {
		this.createdat = createdat;
	}

	public Timestamp getUpdatedat() {
		return updatedat;
	}

	public void setUpdatedat(Timestamp updatedat) {
		this.updatedat = updatedat;
	}	
}

Annotation 

 설명

 @Entity

 해당 클래스의 인스턴스들이 엔티티임을 명시한다.

 Entity class 선언부에는 반드시 설정이 되어야 한다.

 @Table

 설정하는 경우에는 기본적으로 클래스명과 동일한 테이블을 지정한다.

 만일 클래스명과 다른 이름으로 테이블 이름을 지정하고자 하는 경우 name 값을 테이블명으로 작성한다.

 @EntityListeners

 Hibernate를 사용시 Entity를 통해서 자동으로 값을 넣어주고 싶은 경우 사용

 @CreatedDate / @LastModifiedDate 로 지정된 인스턴스에 자동으로 값을 입력하는 기능이다.

 @JsonIgnoreProperties

 

 @Id

 해당 컬럼이 Primary Key라는것을 의미한다.

 @GeneratedValue

 @Id와 함께 사용되며 식별키를 어떤 방식으로 생성하는지를 명시한다.

 strategy 속성과 generator 속성으로 구분된다.

 strategy :

 - AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식

 - TABLE : 키를 생성해주는 채번테이블을 이용하는 방식

 - SEQUENCE : 오라클에서 Sequence를 이용해서 식별키를 생성하는 방식

 - IDENTITY : 기본키 생성방식 자체를 데이터베이스에 위임하는 방식이며 주로 MySql에서 사용됨

 generator :

 - @TableGenerator : strategy(TABLE) 속성과 함께 사용되며 Table을 지정한다.

 - @SequenceGenerator : strategy(SEQUENCE) 속성과 함께 사용되면 Sequence를 지정한다.

 @SequenceGenerator

 @Id에 지정된 Primary Key에서 SEQUENCE로 생성하고자 하는 경우에 Sequence를 지정한다.

 @NotBlank

 Entity 값을 검증하는 기능을 한다.(@NotNull / @NotEmpty / @NotBlank)

 

@NotNull

@NotEmpty

@NotBlank

 null

 허용하지 않음

 허용하지 않음

 허용하지 않음

 ""

 허용

 허용하지 않음

 허용하지 않음

 " "(space)

 허용

 허용

 허용하지 않음


 @Column 필드와 테이블의 컬럼을 매핑하는데 필드와 테이블의 컬럼명이 동일할 경우 생략이 가능하다.
 @Temporal

 자바에서는 모두 Date 객체 이지만
 @Temporal이라는 애노테이션을 사용하여, DB 타입에 맞도록 매핑할 수 있다.

 - TemporalType.Date : 년-월-일 의 date 타입

 - TemporalType.Time : 시:분:초 의  time 타입

 - TemporalType.TIMESTAMP : date + time 의 timestamp(datetime) 타입

 @CreatedDate 처음 entity가 저장될때 생성일을 주입해준다.
 @LastModifiedDate entity가 수정될때 수정일자를 주입해준다.



9. Note class에서 Model을 정의할때 AuditingEntityListener.class를 지정했으므로 EasyNotesApplication.java 파일에 해당 어노테이션 추가

package com.itdev4u;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing //추가
public class EasyNotesApplication {

	public static void main(String[] args) {
		SpringApplication.run(EasyNotesApplication.class, args);
	}
}



Spring RESTFul Web Service


※ 기본적인 RESTful Web Service를 Spring을 이용하여 구축하는 샘플 예제이다.

※ REST방식에서 사용되는 기본적인 Annotation은 아래와 같다.

- @RestController : Controller의 모든 메소드 리턴 타입을 @ResponseBody를 기본으로 지정한다.

- @RequestBody : Client가 보내는 JSON 데이터를 수집 및 가공한다.

- @ResponseBody : Client에게 전송되는 데이터에 맞게 MIME 타입을 결정한다.

- @PathVariable : URL의 경로에 포함된 정보를 추출한다.

- @RequestParam : URL에서 매개변수 GET방식으로 요청받을때 메소드 인수에 매핑한다.


1. STS에서 Spring Start Project에서 새로운 Project를 생성한다.

※ New Spring Starter Project 설정창에서 아래와 같이 입력한다.

- Name : restApiFirst

- Group : com.itdev4u

- Artifact : restApiFirst

- Description : Rest Api Test

- Package : com.itdev4u

※ New Spring Start Project Dependencies 설정창에서 선택사항은 아래와 같다.

- Web


2. STS에서 Spring Start Project에서 새로운 Project를 생성한 후 pom.xml 파일을 수정한다.

- 아래는 pom.xml 파일이다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.itdev4u</groupId>
	<artifactId>restApiFirst</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>restApiFirst</name>
	<description>Rest Api Test</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>


3. SpringBoot가 실행될때 처음으로 실행될 class를 확인한다.

- @SpringBootApplication 어노테이션이 지정된 파일이 SpringBoot가 실행될때 최초로 실행되는 파일이다.

package com.itdev4u;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RestApiFirstApplication {

	public static void main(String[] args) {
		SpringApplication.run(RestApiFirstApplication.class, args);
	}
}


4. Client에게 전송할 데이터 model class파일을 작성한다.

- com.itdev4u.model.Greeting.java 파일을 생성한다.

package com.itdev4u.model;

public class Greeting {
	private final long id;
	private final String content;
	
	public Greeting(long id, String content) {
		this.id = id;
		this.content = content;
	}
	
	public long getId() {
		return id;
	}
	
	public String getContent() {
		return content;
	}
}


5. Client가 요청할 url에 대한 controller class파일을 작성한다.

- com.itdev4u.controller.GreetingController.java

package com.itdev4u.controller;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.itdev4u.model.Greeting;

@RestController
public class GreetingController {
	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();
	
	@RequestMapping("/greeting")
	public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}


6. Project를 Spring Boot App로 Start한 후 브라우져나 Client Tool로 Test한다.

- 본인은 postman을 이용해서 Test함.

※ http://localhost:8080/greeting

==> {"id":5,"content":"Hello, World!"}

※ http://localhost:8080/greetion?name=itdev4u

==> {"id":6,"content":"Hello, itdev4u!"}



Spring Data JPA(Java Persistence API)

 

※ JPA는 ORM(Object Relational Mapping)의 개념을 Java에서 구현하기 위한 스펙이다.

※ JPA 이용시 장점은 아래와 같다.

- DataBase 관련 코드에 대해 유연함을 얻을 수 있다.

- DataBase 독립적으로 개발 할 수 있다.

 

1. STS에서 Spring Start Project에서 새로운 Project를 생성한 후 pom.xml 파일을 수정한다.

- 본인은 Oracle DataBase를 사용하므로 pom.xml 파일에 Oracle 추가 후 STS > Import > Install or deploy an article to Maven reposity에서 추가

- Log관련 추가를 하지 않았을 경우 오류가 발생해서 추가함.

- 아래는 pom.xml 파일이다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.itdev4u</groupId>
	<artifactId>AccessingDatawithJPA</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>AccessingDatawithJPA</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.BUILD-SNAPSHOT</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- Oracle -->
		<dependency>
	        <groupId>com.oracle</groupId>
	        <artifactId>ojdbc6</artifactId>
	        <version>11.2.0.3</version>
    	</dependency>
    	
    	<!-- Log 관련 추가 -->
	    <dependency>
	        <groupId>org.slf4j</groupId>
	        <artifactId>slf4j-api</artifactId>
	        <version>1.7.7</version>
	    </dependency>
	    <dependency>
	        <groupId>ch.qos.logback</groupId>
	        <artifactId>logback-classic</artifactId>
	        <version>1.1.2</version>
	        <exclusions>
	            <exclusion>
	                <groupId>org.slf4j</groupId>
	                <artifactId>slf4j-api</artifactId>
	            </exclusion>
	        </exclusions>
	    </dependency>	    	
		
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
		<pluginRepository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

</project>

 

 

2. application.properites 파일에 DataBase 접속정보를 기록한다.

- /src/main/resources/application.properties

#DataBase
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@192.168.56.101:1521:orcl
spring.datasource.username=scott
spring.datasource.password=password

 

 

3. JPA entity 어노테이션을 사용하여 Customer 객체를 생성한다.

package com.itdev4u.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "CUSTOMER")
public class Customer {
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "customer_seq")
	@SequenceGenerator(sequenceName = "sequence_customer", allocationSize = 1, name="customer_seq")
	private Long id;
	private String firstName;
	private String lastName;
	
	protected Customer() {}
	
	public Customer(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}


	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	
	@Override
	public String toString() {
		return "Customer [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
	}	
}

※ JPA Annotation에 대한 간단한 설명은 아래와 같다.

 Annotation

설명 

 @Entity

 해당 클래스의 인스턴스들이 Entity 임을 명시한다.

 @Table

 해당 클래스가 테이블이 되기 때문에 테이블명을 지정한다.

 클래스명과 테이블명이 동일한 경우에는 생략이 가능하다.

 @Id

 각 Entity를 구별할 수 있는 식별자이며, 테이블의 Primary Key를 의미한다.

 @GeneratedValue

 @Id와 함께 사용되며 식별키를 어떤 방식으로 생성하는지를 명시한다.

 strategy 속성과 generator 속성으로 구분된다.

 strategy :

 - AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식

 - TABLE : 키를 생성해주는 채번테이블을 이용하는 방식

 - SEQUENCE : 오라클에서 Sequence를 이용해서 식별키를 생성하는 방식

 - IDENTITY : 기본키 생성방식 자체를 데이터베이스에 위임하는 방식이며 주로 MySql에서 사용됨

 generator :

 - @TableGenerator : strategy(TABLE) 속성과 함께 사용되며 Table을 지정한다.

 - @SequenceGenerator : strategy(SEQUENCE) 속성과 함께 사용되면 Sequence를 지정한다.

 @Column

 필드와 테이블의 컬럼을 매핑하는데 필드와 테이블의 컬럼명이 동일할 경우 생략이 가능하다.

 

4. Customer 엔티티를 조회하는 Interface를 작성

- CrudRepository Interface를 상속해서 작성한다.

package com.itdev4u.persistence;

import java.util.List;
import org.springframework.data.repository.CrudRepository;
import com.itdev4u.entity.Customer;

public interface CustomerRepository extends CrudRepository<Customer, Long> {
	List findByLastName(String lastName);
}

 

5. 작동 테스트를 위해 SpringBoot 초기 실행 클래스에 저장 및 조회 메소드를 추가한다.

- src/main/java/com/itdev4u.AccessingDatawithJpaApplication.java 파일

package com.itdev4u;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import com.itdev4u.entity.Customer;
import com.itdev4u.persistence.CustomerRepository;

@SpringBootApplication
public class AccessingDatawithJpaApplication {
	private static final Logger log = LoggerFactory.getLogger(AccessingDatawithJpaApplication.class);
	public static void main(String[] args) {
		SpringApplication.run(AccessingDatawithJpaApplication.class, args);
	}
	
	@Bean
	public CommandLineRunner demo(CustomerRepository repository) {
		return (args) -> {
			// save
			repository.save(new Customer("Jack", "Bauer"));
			repository.save(new Customer("Chloe", "O'Brian"));
			repository.save(new Customer("Kim", "Bauer"));
			repository.save(new Customer("David", "Palmer"));
			repository.save(new Customer("Michelle", "Dessler"));
			
			//fetch all customers
			log.info("Customers found with findAll");
			for(Customer customer : repository.findAll()) {
				log.info(customer.toString());
			}
			
			//fetch customer by ID
			repository.findById(1L)
				.ifPresent(customer -> {
					log.info("Customer find by 1");
					log.info(customer.toString());
				});
			
			//fetch customers by last name : create method
			log.info("find last name");
			repository.findByLastName("Bauer").forEach(bauer -> {
				log.info(bauer.toString());
			});
		};
	}
}

 

 

6. 실행 후 eclipse console Log는 아래와 같다.

- 아래에서 붉은색은 application에서 출력한 로그이고 파란색은 hibernate에서 출력한 로그이다.

- hibernate에서 로그 출력은 application.properties 파일에서 셋팅한다.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.0.1.BUILD-SNAPSHOT)

4월 05, 2018 12:30:59 오전 org.apache.catalina.core.StandardService startInternal
정보: Starting service [Tomcat]
4월 05, 2018 12:30:59 오전 org.apache.catalina.core.StandardEngine startInternal
정보: Starting Servlet Engine: Apache Tomcat/8.5.29
4월 05, 2018 12:30:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_162\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre1.8.0_162/bin/server;C:/Program Files/Java/jre1.8.0_162/bin;C:/Program Files/Java/jre1.8.0_162/lib/amd64;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\PuTTY\;D:\itdev4u\sts-bundle\sts-3.9.2.RELEASE;;.]
4월 05, 2018 12:31:00 오전 org.apache.catalina.core.ApplicationContext log
정보: Initializing Spring embedded WebApplicationContext
SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
SLF4J: Defaulting to no-operation MDCAdapter implementation.
SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.
Hibernate: select sequence_customer.nextval from dual
Hibernate: insert into customer (first_name, last_name, id) values (?, ?, ?)
Hibernate: select sequence_customer.nextval from dual
Hibernate: insert into customer (first_name, last_name, id) values (?, ?, ?)
Hibernate: select sequence_customer.nextval from dual
Hibernate: insert into customer (first_name, last_name, id) values (?, ?, ?)
Hibernate: select sequence_customer.nextval from dual
Hibernate: insert into customer (first_name, last_name, id) values (?, ?, ?)
Hibernate: select sequence_customer.nextval from dual
Hibernate: insert into customer (first_name, last_name, id) values (?, ?, ?)
Customers found with findAll
Hibernate: select customer0_.id as id1_0_, customer0_.first_name as first_name2_0_, customer0_.last_name as last_name3_0_ from customer customer0_
Customer [id=11, firstName=Jack, lastName=Bauer]
Customer [id=12, firstName=Chloe, lastName=O'Brian]
Customer [id=13, firstName=Kim, lastName=Bauer]
Customer [id=14, firstName=David, lastName=Palmer]
Customer [id=15, firstName=Michelle, lastName=Dessler]
Hibernate: select customer0_.id as id1_0_0_, customer0_.first_name as first_name2_0_0_, customer0_.last_name as last_name3_0_0_ from customer customer0_ where customer0_.id=?
find last name
Hibernate: select customer0_.id as id1_0_, customer0_.first_name as first_name2_0_, customer0_.last_name as last_name3_0_ from customer customer0_ where customer0_.last_name=?
Customer [id=11, firstName=Jack, lastName=Bauer]
Customer [id=13, firstName=Kim, lastName=Bauer]

 

'개발 > Java' 카테고리의 다른 글

[Spring Boot] JPA Restful CRUD API Sample1  (0) 2018.04.08
Spring RESTFul Web Service  (0) 2018.04.06
CentOS7 Spring개발환경 셋팅2 - Tomcat 설치  (0) 2018.03.31
CentOS7 Spring개발환경 셋팅1 - java 설치  (0) 2018.03.31
Clob To String  (0) 2018.02.20

CentOS7 Spring개발환경 셋팅2 - Tomcat 설치


1. CentOS7에 Java 설치
2. Apache Tomcat 설치


1. Tomcat 다운로드

- http://tomcat.apache.org 사이트에서 다운로드 경로를 확인한다.

- wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29-fulldocs.tar.gz 명령어로 다운로드한다.

[root@localhost Downloads]# wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29.tar.gz
--2018-03-31 23:58:42--  http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29.tar.gz
Resolving mirror.apache-kr.org (mirror.apache-kr.org)... 1.201.139.179
Connecting to mirror.apache-kr.org (mirror.apache-kr.org)|1.201.139.179|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9532698 (9.1M) [application/x-gzip]
Saving to: ‘apache-tomcat-8.5.29.tar.gz’

100%[===============================================================================>] 9,532,698   9.20MB/s   in 1.0s

2018-03-31 23:58:43 (9.20 MB/s) - ‘apache-tomcat-8.5.29.tar.gz’ saved [9532698/9532698]

[root@localhost Downloads]#


2. 다운로드 받은 Tomcat 압축풀기

- tar -zxf apache-tomcat-8.5.29.tar.gz 명령어로 압축을 풀고 확인한다.

- apache-tomcat-8.5.26 디렉토리가 Tomcat 압축이 풀린 디렉토리이다.

[root@localhost Downloads]# tar -zxf apache-tomcat-8.5.29.tar.gz
[root@localhost Downloads]# ls -al
합계 386516
drwxr-xr-x.  3 root root       100  4월  1 00:00 .
dr-xr-x---. 14 root root      4096  3월 31 03:33 ..
drwxr-xr-x.  9 root root       160  4월  1 00:01 apache-tomcat-8.5.29
-rw-r--r--.  1 root root   9532698  3월  5 22:50 apache-tomcat-8.5.29.tar.gz
-rw-r--r--.  1 root root 386252800 12월 21 06:53 jdk-8u162-linux-x64.tar
[root@localhost Downloads]#


3. 설치 디렉토리 생성 및 Tomcat 디렉토리 이동

- 본인은 /usr/local/tomcat 하위에 버전별로 관리한다.

[root@localhost Downloads]# cd /usr/local
[root@localhost local]# mkdir tomcat
[root@localhost local]# cd tomcat
[root@localhost tomcat]# mv /root/Downloads/apache-tomcat-8.5.29 .
[root@localhost tomcat]# ls -al
합계 0
drwxr-xr-x.  3 root root  34  4월  1 00:04 .
drwxr-xr-x. 14 root root 157  4월  1 00:04 ..
drwxr-xr-x.  9 root root 160  4월  1 00:01 apache-tomcat-8.5.29
[root@localhost tomcat]#


4. Tomcat 설정변경

- 본인은 포트를 80번으로 사용하기 위해서 변경을 한다.

- /usr/local/tomcat/apache-tomcat-8.5.29/conf/server.xml 파일에서 port가 8080번으로 셋팅된 부분을 80으로 변경한다.

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->


5. Tomcat 구동 및 확인

- /usr/local/tomcat/apache-tomcat-8.5.29/bin/startup.sh 명령어로 구동확인

[root@localhost conf]# /usr/local/tomcat/apache-tomcat-8.5.29/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-8.5.29
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-8.5.29
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-8.5.29/temp
Using JRE_HOME:        /usr/local/java/jdk1.8.0_162
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-8.5.29/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.29/bin/tomcat-juli.jar
Tomcat started.
[root@localhost conf]#


6. 방화벽에셔 80포트를 허용

- firewall-cmd --permanent --zone=public --add-port=80/tcp 명령어로 방화벽을 오픈한다.

- firewall-cmd --reload 명령어로 방화벽 설정을 적용한다.

[root@localhost conf]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@localhost conf]# firewall-cmd --reload
success
[root@localhost conf]#


7. 브라우져로 확인



'개발 > Java' 카테고리의 다른 글

[Spring Boot] JPA Restful CRUD API Sample1  (0) 2018.04.08
Spring RESTFul Web Service  (0) 2018.04.06
Spring Data JPA 1  (0) 2018.04.04
CentOS7 Spring개발환경 셋팅1 - java 설치  (0) 2018.03.31
Clob To String  (0) 2018.02.20

CentOS7 Spring개발환경 셋팅 - java설치

 

1. CentOS7에 Java 설치

2. Apache Tomcat 설치

 

※ 현재 시스템의 상황은 CentOS7 최소버전으로 설치 한 후 GNOME 데스크탑, Oracle11g가 설치된 상태이다.

 

1. 현재 시스템에 설치된 jdk 확인

- java -version 명령어로 현재 java버전을 확인한다.

- 확인결과 OpenJDK가 설치되어 있는데 OpenJDK를 삭제한다.

 

2. 설치된 OpenJDK 확인

- yum list installed | grep jdk 명령어로 설치된 OpenJDK 확인한다.

 

3. 설치된 OpenJDK 삭제

3.1 yum remove copy-jdk-configs.noarch 명령어로 삭제한다.

※ copy-jdk-configs.noarch 만 삭제하면 2번의 목록에서 보여지는 OpenJDK가 모두 삭제된다.

[root@localhost local]# yum remove copy-jdk-configs.noarch
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies
--> Running transaction check
---> Package copy-jdk-configs.noarch 0:2.2-5.el7_4 will be erased
--> Processing Dependency: copy-jdk-configs >= 2.2 for package: 1:java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: copy-jdk-configs >= 2.2 for package: 1:java-1.8.0-openjdk-headless-1.8.0.161-0.b14.el7_4.x86_64
--> Running transaction check
---> Package java-1.7.0-openjdk-headless.x86_64 1:1.7.0.171-2.6.13.0.el7_4 will be erased
--> Processing Dependency: java-1.7.0-openjdk-headless = 1:1.7.0.171-2.6.13.0.el7_4 for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libawt.so()(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libawt.so()(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjava.so()(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjava.so()(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjava.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjava.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjli.so()(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjli.so()(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjli.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjli.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjvm.so()(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjvm.so()(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
--> Processing Dependency: libjvm.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
--> Processing Dependency: libjvm.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64
---> Package java-1.8.0-openjdk-headless.x86_64 1:1.8.0.161-0.b14.el7_4 will be erased
--> Running transaction check
---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.171-2.6.13.0.el7_4 will be erased
--> Processing Dependency: java >= 1.5 for package: jline-1.0-8.el7.noarch
---> Package java-1.8.0-openjdk.x86_64 1:1.8.0.161-0.b14.el7_4 will be erased
--> Processing Dependency: java-1.8.0-openjdk for package: icedtea-web-1.6.2-4.el7.x86_64
--> Running transaction check
---> Package icedtea-web.x86_64 0:1.6.2-4.el7 will be erased
---> Package jline.noarch 0:1.0-8.el7 will be erased
--> Processing Dependency: jline for package: rhino-1.7R5-1.el7.noarch
--> Running transaction check
---> Package rhino.noarch 0:1.7R5-1.el7 will be erased
--> Finished Dependency Resolution
base/7/x86_64                                            | 3.6 kB     00:00
extras/7/x86_64                                          | 3.4 kB     00:00
updates/7/x86_64                                         | 3.4 kB     00:00
updates/7/x86_64/primary_db                              | 6.9 MB     00:03

Dependencies Resolved

================================================================================
 Package                     Arch   Version                      Repository
                                                                           Size
================================================================================
Removing:
 copy-jdk-configs            noarch 2.2-5.el7_4                  @updates  13 k
Removing for dependencies:
 icedtea-web                 x86_64 1.6.2-4.el7                  @base    2.1 M
 java-1.7.0-openjdk          x86_64 1:1.7.0.171-2.6.13.0.el7_4   @updates 549 k
 java-1.7.0-openjdk-headless x86_64 1:1.7.0.171-2.6.13.0.el7_4   @updates  92 M
 java-1.8.0-openjdk          x86_64 1:1.8.0.161-0.b14.el7_4      @updates 501 k
 java-1.8.0-openjdk-headless x86_64 1:1.8.0.161-0.b14.el7_4      @updates 103 M
 jline                       noarch 1.0-8.el7                    @base     72 k
 rhino                       noarch 1.7R5-1.el7                  @base    1.1 M

Transaction Summary
================================================================================
Remove  1 Package (+7 Dependent packages)

Installed size: 200 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : icedtea-web-1.6.2-4.el7.x86_64                               1/8
  Erasing    : rhino-1.7R5-1.el7.noarch                                     2/8
  Erasing    : jline-1.0-8.el7.noarch                                       3/8
  Erasing    : 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64            4/8
  Erasing    : 1:java-1.8.0-openjdk-headless-1.8.0.161-0.b14.el7_4.x86_64   5/8
  Erasing    : 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64         6/8
  Erasing    : 1:java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.0.el7_4.x86   7/8
  Erasing    : copy-jdk-configs-2.2-5.el7_4.noarch                          8/8
  Verifying  : copy-jdk-configs-2.2-5.el7_4.noarch                          1/8
  Verifying  : 1:java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64            2/8
  Verifying  : 1:java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.0.el7_4.x86   3/8
  Verifying  : icedtea-web-1.6.2-4.el7.x86_64                               4/8
  Verifying  : 1:java-1.7.0-openjdk-1.7.0.171-2.6.13.0.el7_4.x86_64         5/8
  Verifying  : 1:java-1.8.0-openjdk-headless-1.8.0.161-0.b14.el7_4.x86_64   6/8
  Verifying  : jline-1.0-8.el7.noarch                                       7/8
  Verifying  : rhino-1.7R5-1.el7.noarch                                     8/8

Removed:
  copy-jdk-configs.noarch 0:2.2-5.el7_4

Dependency Removed:
  icedtea-web.x86_64 0:1.6.2-4.el7
  java-1.7.0-openjdk.x86_64 1:1.7.0.171-2.6.13.0.el7_4
  java-1.7.0-openjdk-headless.x86_64 1:1.7.0.171-2.6.13.0.el7_4
  java-1.8.0-openjdk.x86_64 1:1.8.0.161-0.b14.el7_4
  java-1.8.0-openjdk-headless.x86_64 1:1.8.0.161-0.b14.el7_4
  jline.noarch 0:1.0-8.el7
  rhino.noarch 0:1.7R5-1.el7

Complete! 

3.2 yum list installed | grep jdk 명령어로 삭제확인

[root@localhost local]# yum list installed | grep jdk
[root@localhost local]#

3.3 java -version 명령으로 java 삭제확인

[root@localhost local]# java -version
-bash: /usr/bin/java: 그런 파일이나 디렉터리가 없습니다

 

4. Oracle jdk 다운로드

- wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"  http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz 명령어로 다운로드 받는다.

※ 다운로드 주소는 오라클사이트에서 해당 파일의 링크주소를 복사해야 한다.

 [root@localhost Downloads]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"  http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
--2018-03-31 03:15:33--  http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
Resolving download.oracle.com (download.oracle.com)... 23.53.224.97
Connecting to download.oracle.com (download.oracle.com)|23.53.224.97|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://edelivery.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz [following]
--2018-03-31 03:15:33--  https://edelivery.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
Resolving edelivery.oracle.com (edelivery.oracle.com)... 184.25.23.111, 2600:1417:e:28e::2d3e, 2600:1417:e:28b::2d3e
Connecting to edelivery.oracle.com (edelivery.oracle.com)|184.25.23.111|:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz?AuthParam=1522433853_8a39721c1efbf9f1092d8b9c03a0881b [following]
--2018-03-31 03:15:33--  http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz?AuthParam=1522433853_8a39721c1efbf9f1092d8b9c03a0881b
Connecting to download.oracle.com (download.oracle.com)|23.53.224.97|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 189815615 (181M) [application/x-gzip]
Saving to: ‘jdk-8u162-linux-x64.tar.gz’

 

100%[======================================>] 189,815,615 2.80MB/s   in 66s

 

2018-03-31 03:16:41 (2.72 MB/s) - ‘jdk-8u162-linux-x64.tar.gz’ saved [189815615/189815615]

 

5. java파일 압축해제

[root@localhost Downloads]# gunzip jdk-8u162-linux-x64.tar.gz
[root@localhost Downloads]# ls
jdk-8u162-linux-x64.tar

[root@localhost Downloads]# tar -xvf jdk-8u162-linux-x64.tar

......

...... 생략

[root@localhost Downloads]# ls -al
합계 377204
drwxr-xr-x.  3 root root        57  3월 31 03:20 .
dr-xr-x---. 13 root root      4096  3월 30 01:15 ..
-rw-r--r--.  1 root root 386252800 12월 21 06:53 jdk-8u162-linux-x64.tar
drwxr-xr-x.  8   10  143       255 12월 20 14:27 jdk1.8.0_162
[root@localhost Downloads]#

 

6. 압축해제한 jdk1.8.0_162 디렉토리를 설치할 디렉토리로 이동

=> 본인은 /usr/local/java 디렉토리내에 java 버전별로 관리한다.

[root@localhost Downloads]# mv jdk1.8.0_162/ /usr/local/java
[root@localhost Downloads]# cd /usr/local/java/
[root@localhost java]# ls -al
합계 0
drwxr-xr-x.  3 root root  26  3월 31 03:26 .
drwxr-xr-x. 13 root root 143  3월 31 03:25 ..
drwxr-xr-x.  8   10  143 255 12월 20 14:27 jdk1.8.0_162

 

7. 환경변수 셋팅

- /etc/profile 파일 맨 아래에 환경변수 추가한다.

export JAVA_HOME=/usr/local/java/jdk1.8.0_162
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH="."

8. 환경변수 적용 및 java 버전확인

[root@localhost java]# source /etc/profile
[root@localhost java]# java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
[root@localhost java]#

 

'개발 > Java' 카테고리의 다른 글

[Spring Boot] JPA Restful CRUD API Sample1  (0) 2018.04.08
Spring RESTFul Web Service  (0) 2018.04.06
Spring Data JPA 1  (0) 2018.04.04
CentOS7 Spring개발환경 셋팅2 - Tomcat 설치  (0) 2018.03.31
Clob To String  (0) 2018.02.20
public class Util {
    public static String clobToStr(Clob clob) throws IOException, SQLException {
        if(clob == null) {
            return "";
        } else {
            BufferedReader contentReader = new BufferedReader(clob.getCharacterStream());
            StringBuffer out = new StringBuffer();
            String aux;
            while((aux = contentReader.readLine())!=null) {
                out.append(aux);
            }
            return out.toString();
        }
    }
}

'개발 > Java' 카테고리의 다른 글

[Spring Boot] JPA Restful CRUD API Sample1  (0) 2018.04.08
Spring RESTFul Web Service  (0) 2018.04.06
Spring Data JPA 1  (0) 2018.04.04
CentOS7 Spring개발환경 셋팅2 - Tomcat 설치  (0) 2018.03.31
CentOS7 Spring개발환경 셋팅1 - java 설치  (0) 2018.03.31

+ Recent posts