🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

발생 Error

SpringBoot에서 다음 Source Code를 실행할 경우,

🚨다음과 같은 Error 발생

No EntityManager with actual transaction available for current thread

 - cannot reliably process 'persist' call; nested exception is javax.persistence.

 

 

발생 원인

JPA는 transaction을 기반으로 작동하므로 JPA사용 시, @Transactional 선언 필요

 

 

해결 방법

Class에 @Transactional 추가

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

 

java.util.Date: 날짜와 시간을 다룰 목적으로 만들어진 class

Date Method는 거의 deprecated(앞으로 사라질 수도 있으니 사용하지 말라)되었지만, 여전히 사용 중

 

java.util.Calendar: Data class를 개선한 새로운 class

 

java.time package: Data와 Calendar의 단점을 개선한 새로운 class를 제공

 

Calendear class(abstract class)

-> 인스턴스 생성할 수 X

 

Calendar cal = new Calendar(); (X)

-> getInstance() method 사용하여 객체 생성

Calendar cal = Calendar.getInstance();

 

get()으로 날짜와 시간 필드 가져오기: int get(int field)

Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅됨

int this Year = cal.get(Calendar.YEAR); // 올해가 몇년인가

int lastDayOfMonth = cal.getActualMaxium(Calendar.DATE); // 이 달의 마지막날

 

Calendar에 정의된 필드

 

- YEAR: 년

- MONTH: 월(0부터 시작)

- DATE: 일

- WEEK_OF_YEAR: 그 해의 몇 번째 주

- WEEK_OF_MONTH: 그 달의 몇 번째 주

- DAY_OF_MONTH: 그 달의 몇 번째 일

- DAY_OF_YEAR: 그 해의 몇 번째 일

- DAY_OF_WEEK: 요일(1: 일요일)

- DAY_OF_WEEK_IN_MONTH: 그 달의 몇 번째 요일

- HOUR: 시간(0~11)

- HOUR_OF_DAY: 시간(0~23)

- MINUTE: 분

- SECOND: 초

- MILLISECOND: 천분의 일초

- ZONE_OFFSET: GMT 기준 시차

- AM_PM: 오전, 오후

* 날짜 지정 시, 월이 0부터 시작한다는 점에 유의

 

날짜 간의 차이: 초단위로 변경 후 계산→년월일로 재변환

* 초→시분초로 재변환 시, 거스름돈 큰 것부터 나눠주는 방식 차용

1460원= 500_2개+100_4개+50_1개+10_1개

 

clear()는 calendar 객체의 모든 필드를 1970.1.1 00:00:00으로 초기화

→ 객체를 생성하고 나서는 clear()를 꼭 해주고 나서 set method 사용

 

 

clear(int field)는 calendar 객체의 특정 필드를 초기화

get(): 필드 읽기

set(): 필드 변경

add(): 특정 필드 값을 증가 또는 감소

- 다른 필드에 영향: 8월 31일→ +1일→ 9월 1일

roll(): 특정 필드 값을 증가 또는 감소

- 다른 필드에 영향X: 8월 31일→ +1일→ 8월 1일

 

달력 만들기

 

Date Method의 대부분은 deprecated 되었지만 여전히 사용 중

calendar와의 호환이 필요할 때가 있음

* Calendar→Date

Calendar cal = Calendar.getInstance();

Date d = new Date(cal.getTimeInMillis());

 

* Date→Calendar

Date d = new Date();

Calendar cal = Calendar.getInstance();

cal.setTime(d);

 

형식화 class: DecimalFormat, SimpleDateFormat

숫자와 날짜를 원하는 형식으로 쉽게 출력 가능

(숫자, 날짜↔문자열)

 

* DecimalFormat: 숫자→형식 문자열

double number = 1234567.89;

DecimalFormat df = new DecimalFormat(”#.#E0”)

String result = df.format(number); // 1.2E6

 

형식 문자열→숫자

DecimalFormat df = new DecimalFormat(”#,###.##”);

Number num = df.parse(”1,234,567.89”);

double d = num.doubleValue(); // 1234567.89

* Integer.parseInt는 ','가 포함된 문자열을 숫자로 변환 못함

 

* SimpleDateFormat()

Date today = new Date();

SimpleDateFormat df = new SimpleDateFormat(”yyyy-MM-dd”);

String result = df.format(today); // 2023-01-01

 

M-Month, m-minute

D-1년 기준, d-해당 월 기준

H-23시간제, h-12간제

m-분, s-초

 

 

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 [자바의 정석] ch10-4~8 Calendar예제

 

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

 

 

 

 

SpringBoot src 기본 폴더 구조는 좌측 이미지와 같다.

 

이번 포스팅에서는 resources 폴더와 관련된 static, templates 폴더에 대해 간략히 정리하고자 한다.

 

 

 

 

 

 

 

 

/static: 웹 개발 방법(static contents, MVC+template Engine, API) 중 하나인 static contents*가 위치하는 곳으로 html, CSS, javaScript 등을 저장한다. SpringBoot 라이브러리에 포함되어있는 WepProperties.java에서 Resources()는 static file 경로에 대해 다음과 같이 설정되어있다.

 

 

/templates: view에 사용할 thymeleaf 파일이 위치하며, SpringBoot에서는 기본적으로 thymeleaf라는 template를 이용해 html을 불러온다.

SpringBoot는 기본적으로 thymeleaf에 대한 auto-configuration을 지원하고 있으며, 자동 인식을 위해서는 src/main/resources/templates에 파일을 저장해야한다고 안내하고 있다(참조).

 

 

* static contents: 정적 컨텐츠, html 파일을 그대로 전달하여, 웹페이지에 보여지는 파일로 파일명 그대로 접속이 가능

 

 

 

➕ 만일 static 폴더가 아닌 다른 폴더에서 정적 컨텐츠를 관리하고 싶다면, 다음과 같은 추가 설정이 필요하다.

1. Configuration 파일 생성 후, implement WebMvcConfigurer

2. @Override addResourceHandlers

(자세한 내용은 참고 자료 확인)

 

 

 

참고 자료

📑 SpringBoot Manual

📑 SpringBoot docs

📑 Spring Boot HTML 파일 templates에서도 읽도록 설정하기

 

'Java > Spring' 카테고리의 다른 글

[SpringBoot] WebClient  (0) 2023.08.23
[SpringBoot] 스프링 부트 프로젝트 생성  (0) 2023.08.23

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

String: 생성 후 불변

StringBuffer: 생성 후 변경 가능

 

StringBuffer sb = new StringBuffer(”abc”);

‘a’ ’b’ ’c’ 문자형 배열을 내부적으로 갖음

 

sb.append(”123”)

sb 내용 뒤 새로운 객체 생성없이 “123” 추가 가능

 

배열도 String과 마찬가지로 한 번 만들어지면 길이를 변경할 수 없음

그러므로 공간이 부족할 경우 새로운 배열을 생성해야 함

* 새로운 배열 생성 -> 기존 배열 내용 복사 ->참조 변경

 

append()

: 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환

cf. delete 삭제, insert 삽입

 

StringBuffer sb2 = sb.append(”_okay”); // sb2 내용 뒤에 okay 추가

System.out.println(sb); // "abc123"

System.out.println(sb2); // "abc123_okay"

*sb instance address = sb instance address

 

StringBuffer: String과 달리 equals()가 오버라이딩 되어있지 않아 주소를 비교

→ String으로 변환 후 equals로 비교

 

StringBuffer Example

 

StringBuffer.capacity()

 

cf. 상수와 리터럴

int year = 2021;

fianl int MAX_VALUE = 100;

year: 변수, MAX_VALUE: 상수, 2021,100: 리터럴

상수: 값을 한 번 저장하면 변경할 수 없는 저장공간으로 정의하였기에 이와 구분하기 위해 리터럴이라는 이름을 사용

 

StringBuffer.append()

 

cf. Integer type

long type: ____L

16진수: 0x____

8진수: 0___

 

cf. StringBuilder/StringBuffer

StringBuilder - 동기화X

StringBuffer - 동기화o, 데이터 보호를 통한 멀티 쓰레드에 안전

동기화는 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능 저하

 

Match class: 수학관련 static method 집합

 

Wrapper class: 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스

 

- 기본형→Wrapper Class

- boolean→Boolean

- char→Chracter

- byte→Byte

- short→Short

- int→Integer

- long→Long

- float→Float

- double→Double

 

Number class: 모든 숫자 래퍼 클래스의 조상(추상 클래스)

 

Integer(10^19)→BigInteger(아주 큰 정수)

Double(10^308)→BigDecimal(아주 큰 실수)

 

Wrapper→기본형 전환 method 보유

 

* Object 클래스의 equals 메소드는 기본적으로 == 연산자를 사용하여 두 객체의 주소값을 비교

다만, 우리가 알고 있는 String 클래스에서 equals 메소드는 용도에 맞게 재정의(오버라이딩) 되어 있음

때문에 String 클래스에서의 equals는 두 객체의 주소값을 비교하는게 아니라, 두 객체의 내용이 같은지 비교할 수 있음

 

문자열→숫자

int i = new Integer("100").intValue();

* 경고: 생성자 Integer(int)는 버전 9 이후 더이상 사용되지 않음

int i2 = Integer.parseInt("100");

 

문자열→Wrapper class

Integer i3 = Integer.valueOf("100");

Byte b = new Byte("100");

Byte b = Byte.valueOf("100")

 

n진법의 문자열을 숫자로 변환하는 방법

int i4 = Integer.parseInt("100", 2) = 4

 

기본형과 참조형간의 자동 형변환

int→Integer: AutoBoxing

Integer→int: UnBoxing

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

Boolean equals(Obhect obj): 객체 자신과 주어진 객체를 비교(T/F)

* 서로 다른 두 객체는 항상 주소가 다르므로 주소 비교시 false

→ value로 오버라이딩 해서 사용

 

cv: 객체마다 공통된 수로 공유된 값

iv: iv의 값을 비교할 수 있도록 equals()를 오버라이팅해야 함

 

hashCode()

Object class의 hashCode()는 객체의 주소를 int로 변환해서 반환

Cf. System.identityHashCode(Object obj)은 Object class의 hashCode()와 동일

 

* Objects.hash( ) 메소드: 매개변수로 주어진 값들을 이용해서 교유한 해시 코드를 생성

-> 동일한 값을 가지는 객체들의 필드로 해시 코드를 생성하게 되면, 동일한 해시 코드를 갖게 됨

 

cf. identityHashCode 메소드

만일, hash코드가 오버라이딩 된 이후 해당 객체 고유의 해시 코드 값을 알고 싶을 때 사용

 

 

equals: 주소→iv

hashcode: 주소→int

* equals의 결과가 같으면 hashcode도 같아야하므로 같이 오버라이딩 해줘야함

 

 

toString(): 객체를 문자열로 변환하기 위한 메서드

 

String class의 경우, 객체를 새로 생성해서 문자를 결합

예: a-0x100 b-0x200 →a+b=ab-0x300

-> 버려지는 객체 주소들이 많으므로 stringbuffer 사용

 

String str1 = “abc”;

String str2 = “abc”;

String str3 = new String(”abc”);

String str4 = new String(”abc”);

 

str1(0x100): 0x100=”abc”

str2(0x100): 0x100=”abc”

 

str3, str4는 새로운 객체를 생성하였으므로 주소가 다름

str3(0x200): 0x200=”abc”

str4(0x300): 0x300=”abc”

cf. 주소비교(==), 값 비교(equals),

 

문자열 리터럴

같은 내용의 문자열 리터럴은 하나만 만들어지며, constant pool에 저장

 

문자 초기화

String str = “”; // str을 빈 문자열로 초기화

 

String str = “”;

String str = “”; // 객체 총 1개 생성

String s = new String(””); - 객체 1개 생성

String s = new String(””); - 객체 총 2개 생성(메모리 낭비)

 

java.util pkg

 

 

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 자바의 정석 9장 - Object 클래스 - equals ()

📑 [자바] equals, hashcode 같이 오버라이딩 하는 이유