// MemberController.java
package com.herojoon.jpaproject.controller;
import com.herojoon.jpaproject.entity.Member;
import com.herojoon.jpaproject.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@RequestMapping("api/member")
@RestController
public class MemberController {
private final MemberService memberService;
/**
* Member 생성
*
* @return
* @throws ParseException
*/
@PostMapping("create")
public ResponseEntity<Member> createMember() throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2011-12-03");
Member member = Member.builder()
.name("herojoon")
.email("herojoon432@gmail.com")
.nickname("heroble")
.age(10)
.birthday(date)
.build();
Member savedMember = memberService.createMember(member);
return new ResponseEntity<>(savedMember, HttpStatus.OK);
}
/**
* Member 수정
*
* @return
* @throws ParseException
*/
@PutMapping("update")
public ResponseEntity<Member> updateMember() throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2011-12-03");
Member member = Member.builder()
.id(1l)
.name("herojoon2")
.email("herojoon432@gmail.com")
.nickname("heroble2")
.age(10)
.birthday(date)
.build();
Member updatedMember = memberService.updateMember(member);
if (!ObjectUtils.isEmpty(updatedMember)) {
return new ResponseEntity<>(updatedMember, HttpStatus.OK);
} else {
return new ResponseEntity<>(member, HttpStatus.NOT_FOUND);
}
}
/**
* Member List 조회
*
* @return
*/
@GetMapping("list")
public ResponseEntity<List<Member>> getMembers() {
List<Member> members = memberService.getMembers();
return new ResponseEntity<>(members, HttpStatus.OK);
}
/**
* Id에 해당하는 Member 조회
*
* @param id
* @return
*/
@GetMapping("{id}")
public ResponseEntity<Member> getMember(
@PathVariable("id") Long id) {
Member member = memberService.getMember(id);
return new ResponseEntity<>(member, HttpStatus.OK);
}
/**
* Id에 해당하는 Member 삭제
*
* @param id
* @return
*/
@DeleteMapping("{id}")
public ResponseEntity<Long> deleteMember(
@PathVariable("id") Long id) {
memberService.deleteMember(id);
return new ResponseEntity<>(id, HttpStatus.OK);
}
}
// MemberService.java
package com.herojoon.jpaproject.service;
import com.herojoon.jpaproject.entity.Member;
import com.herojoon.jpaproject.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
/**
* Member 생성
*
* @param member
* @return
*/
public Member createMember(Member member) {
Member savedMember = memberRepository.save(member); // JpaRepository에서 제공하는 save() 함수
return savedMember;
}
/**
* Member 수정
* JPA Repository의 save Method를 사용하여 객체를 업데이트 할 수 있습니다.
* Entity Member에 @Id로 설정한 키 값이 존재할 경우 해당하는 데이터를 업데이트 해줍니다.
* 만약 수정하려는 Entity Member 객체에 @Id 값이 존재하지 않으면 Insert 되기 때문에
* 아래와 같이 업데이트 하고자 하는 Member가 존재하는지 체크하는 로직을 추가하였습니다.
*
* @param member
* @return
*/
public Member updateMember(Member member) {
Member updatedMember = null;
try {
Member existMember = getMember(member.getId());
if (!ObjectUtils.isEmpty(existMember)) {
updatedMember = memberRepository.save(member); // JpaRepository에서 제공하는 save() 함수
}
} catch (Exception e) {
log.info("[Fail] e: " + e.toString());
} finally {
return updatedMember;
}
}
/**
* Member List 조회
*
* @return
*/
public List<Member> getMembers() {
return memberRepository.findAll(); // JpaRepository에서 제공하는 findAll() 함수
}
/**
* Id에 해당하는 Member 조회
*
* @param id
* @return
*/
public Member getMember(Long id) {
return memberRepository.getById(id); // JpaRepository에서 제공하는 getById() 함수
}
/**
* Id에 해당하는 Member 삭제
*
* @param id
*/
public void deleteMember(Long id) {
memberRepository.deleteById(id); // JpaRepository에서 제공하는 deleteById() 함수
}
}
기존 데스크탑에서 자바어플리케이션 개발 및 배포를 해오다 얼마전부터 데스크탑의 맛탱이가는 증세를 보고 개발환경을 노트북으로 바꾸는 과정이었다.
jdk최신버전 설치후 STS4설치하고 war import해서 로컬에서 빌드하니 정상적으로 나왔다. 서버쪽 수정 후 서버에 배포하니 웹서비스들이 미쳐돌아가고 있었다. 하나는 500에러를 내뿜고 하나는 고양이만 나오고 있었다. 분명 심각한 문제가 발생한 것이다.
톰캣 로그를 보았다.
Caused by: java.lang.UnsupportedClassVersionError: kr/pe/innu/stock/dao/StockDaoImpl has been compiled by a more recent version of the Java Runtime (class file version 61.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
(클래스 [kr.pe.innu.stock.dao.StockDaoImpl]을(를) 로드할 수 없습니다)
...
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [kr.pe.innu.stock.service.StockServiceImpl] for bean with name 'stockService' defined in ServletContext resource
[/WEB-INF/spring/appServlet/servlet-context.xml]: problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: kr/pe/innu/stock/service/StockServiceImpl has been compiled by a more recent version of the Java Runtime
(class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
(클래스 [kr.pe.innu.stock.service.StockServiceImpl]을(를) 로드할 수 없습니다)
대충보니 클래스파일은 version 61로 되어 있는데 이 시스템은 version 52까지 인식하는거 같다.
노트북에 jdk 최신버전(J2SE 17)을 설치했었는데 아무래도 이게 문제인거 같다. 우선 개발환경과 배포환경의 jdk버전을 맞추는게 필요했다. 최신버전보다는 이전버전으로 개발환경의 jdk(J2SE8)를 다시 설치했다.
그리고 STS의 컴파일러 적용버전을 바꿔주었다.
STS를 다시 켜서 빌드를 하고 클래스버전을 확인하니 배포서버의 버전과 같았고 정상 배포됨을 확인했다.
자바 클래스 버전은 jdk1.1이 메이저버전 45 이고 이후 1씩 증가한다. 나의 배포서버는 Centos7이며 J2SE8(메이저버전 52)이고 현재 최신버전은 J2SE17(메이저버전 61)이다.