Book
[Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈
application.properties 파일을 생성하여 아래와 같은 코드를 작성하고 실행을 하였습니다. ## jpa spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 아래 사진과 같은 오류가 나타납니다. 시도 [x] properties 파일을 삭제하고 다시 생성하여 실행 [x] spring.jpa.hibernate.ddl-auto=create 또는 update 구문 추가 implementation 'com.h2database:h2:1.4.199' 버전 수정하여 해결 기존의 스프링 부트 버전이 2.6.5 의 최신 버전이었습니다. 최신 버전이 h2 db 와 호환이 잘..
[Book] 6) JPA 로 데이터베이스를 다루어보자!
🕶 들어가기 앞서... 웹 개발을 운영시에 데이터베이스를 다루는 일이 많습니다. 기능 개발을 하여도 데이터베이스와 연동하는 것을 피할 수 없습니다. 자바에서는 객체지향 프로그래밍을 지향하고 있고 데이터베이스는 관계형 데이터베이스를 지향하고 있습니다. 이둘의 차이를 극복하게 해주는 기술이 바로 JPA 라는 자바 표준 ORM 기술입니다. JPA 라는 자바 표준 ORM 은 자바에서의 객체의 멤버들을 데이터베이스와 매핑(Mapping) 을 시켜주어 간단하게 관계를 맷어줄 수 있고 자바와 데이터베이스의 패러다임 불일치 문제, 즉 객체지향 프로그래밍과 관계형 데이터베이스의 관계 불일치 문제점을 해결 해주는 기술입니다. 🕶 JPA를 사용시 좋은점.. 자바 개발을 할 때 객체지향 프로그래밍을 할 수 있게 도와주고 JP..
[Book] 5) 롬복(Lombok) 을 사용해보자!
🕶 롬복(Lombok) 의존성을 추가해보자! 롬복을 사용하기전에 의존성을 추가해야합니다. 그러므로 build.gradle 파일에 가서 compileOnly 'org.projectlombok:lombok:1.18.22' 을 추가해 줍니다, 빌드를 실행하고 플러그인에 가서 Lombok 을 설치해 줍니다. 🕶 의존성을 추가해줬다면 롬복기능을 사용해보자! 지금의 프로젝트처럼 작은 규모가 아닌 큰 규모에 프로젝트였다면 롬복으로 전환이 쉽게 됬을 까요?? 쉽지 않았을 겁니다. 매번 코드에 Lombok 기능을 추가하고 코드를 수정하고 반복적인 작업이 될겁니다. 그리고 수정한기능이 제데로 작동하는지 알 수 가 없었을 겁니다. 하지만 지난 시간에 작성한 테스트 코드 로 인해 쉽게 검증을 할 수 있습니다. 이러한 이유로 ..
[Book] 4) HelloController 생성과 테스트를 해보자!
👻 메인 클래스를 살펴봅시다. @SpringBootApplication -> 1 public class BoardSpringbootWebserviceApplication{ public static void main(String[]args) { SpringApplication.run(BoardSpringbootWebserviceApplication.class, args); } } @SpringBootApplication 으로 인해 스프링 부트의 자동 설정과 스프링이 관리하는 Bean 읽기와 생성을 모두 자동으로 설정됩니다. 주의 : @SpringBootApplication 이 있는 위치부터 설정을 읽어가기 때문에 이클래스는 항상 프로젝트의 최상단에 위치해야만 합니다. main method 에서 실행하는 S..
[Book] 3) 테스트 코드를 작성해보자!
🕶 들어가기 앞서... 견고한 서비스를 만들기 위해서는 TDD 하거나 최소한 단위 테스트 코드를 꼭 작성 해야합니다. 대부분의 회사가 테스트 코드에 관해 요구를 하고 있으며 채용 정보를 보아도 “테스트의 경험이 있는 분" 을 많이 뽑는 것을 볼 수 있습니다. 이처럼 테스트 코드는 절대 빠질 수 없는 요소 중에 하나라고 볼 수 있습니다. 먼저 테스트 코드를 작성하기 전에 TDD 와 단위 테스트에 대한 개념들을 조금씩 살펴 봅시다. TDD 는 테스트가 주도하는 개발을 의미합니다. “테스트 코드를 작성을 하며 개발을 진행한다.” 라는 이야기입니다. 단위 테스트 는 TDD의 첫번째 단계인 기능 단위 테스트 코드를 작성하는 것을 이야기 합니다. 지금은 TDD 가 아닌 단위 테스트 코드 를 배우는 것을 목표로 두고..
[Book] 2) 인텔리제이에서 깃허브와 연동해보자!
🕶 인텔리제이에서 깃허브와 연동해보자! IT 개발자들 사이와 회사들은 보통 버전 관리를 깃허브를 통해서 관리합니다. 깃허브를 사용하는 방법을 따로 공부하시면 좋겠습니다. 깃허브는 무료로 사용할 수 있는 장점과 가장 대중적인 repository 입니다. 인텔리제이에서 Aaction 창 을 열고 share project on github 을 검색하여 실행해줍니다. 로그인창이 나오 실 텐데 깃허브 아이디 비밀번호를 입력하시고 로그인을 해주고 share 버튼을 누릅니다. 처음으로 commit 을 할 건지 창이 나올 겁니다. 이때 우리는 commit 이전에 깃허브에 올리지 않아도 되는 파일들이 있으므로 No 버튼을 누릅니다. 다음 창에 commit 을 진행 할 파일들을 선택하는 창이 나올 겁니다. 이때 idea ..
[Book] 1) 프로젝트를 만들고 의존성을 추가해보자!
인텔리제이가 설치 되었다는 가정하에 진행 해보도록 하겠습니다. 🕶 프로젝트를 만들고 의존성을 추가해보자! 우선 인텔리제이를 열어서 프로젝트를 만듭니다. 프로젝트 이름은 되도록이면 무슨 서비스인지 알만한 이름으로 지어주시면 좋습니다. 프로젝트 이름을 지어주셨다면 gradle 를 선택하여 프로젝트를 만듭니다. 다음으로 의존성 을 추가해야 합니다. 기본적으로 implementation 'org.springframework.boot:spring-boot-starter-web' 를 선택하여 만듭니다. 필요한 의존성이 있으면 프로젝트를 만든 후에도 추가를 할 수 있습니다. 프로젝트 만들기를 진행하시고 추가한 의존성이 있어 빌드 하는데 시간이 걸립니다. 빌드가 완료 되면 build.gradle 파일을 열어 의존성이 ..
[Book] ITEM 9) try-finally 대신 try-with-resource 를 사용하라
🤢 try-finally 사용 public String fileRead1(String file)throws IOException { BufferedReader br = null; try{ br = new BufferedReader(new FileReader(file)); return br.readLine(); } catch(Exception e) { e.printStackTrace(); }finally{ br.close(); } return file; } 예외를 잡는데 여러줄의 코드가 작성되었습니다. 이러한 경우 예외가 발생하면 스택 트레이스에 추적이 어려울 것입니다. 이 방법의 대안점은 try-with-resource 를 사용하는 것입니다. 🤢 try-with-resource public String ..
[Book] ITEM 8) finalizer 와 cleaner는 피하라
finalizer 는 Object의 finalizer() 메서드를 말합니다. gc 의 대상이 되는 인스턴스가 있으면 finalizer() 메서드가 작동이 되어야하는데 finalizer() 는 동작의 예측이 불가능합니다. 예제를 보면서 확인 해 봅시다. Finalizer 클래스가 있고 오버라이드 한 finalize() 메서드와 hello() , hello2() 메서드가 있습니다. public class Finalizer { @Override protected void finalize()throws Throwable{ System.out.println("finalize 동작"); } public void hello() { System.out.println("hello 동작"); } } Main 클래스가 있고..
[Book] ITEM 7) 더이상 쓰지 않는 객체 레퍼런스는 없애자
자바에서 가비지 컬렉터는 필요 없는 메모리를 관리해 주는 역할을 해줍니다. 하지만 가비지 컬렉터에게 모든 메모리 관리를 맡기면 안됩니다. 예를 보겠습니다. 😱 Stack 의 메모리 누수 Stack 클래스의 코드를 살펴보겠습니다 public class StackSample { private Object[] elements; private int size = 0; private static final intDEFAULT_INITIAL_CAPACITY= 16; public StackSample() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++]= e;..
[Book] ITEM 6) 불필요한 객체는 만들지 말자
기능적으로 동일한 객체를 새로 만드는 대신 객체 하나를 재사용하는 것이 적절합니다. 🥺 문자열 객체 문자열 객체 를 예로 들어봅시다. String name = "name"; String name1 = "name"; String name2 = new String("name"); // 불필요한 객체 예시 System.out.println(name == name1); // true System.out.println(name1 == name2); // false System.out.println(name1.equals(name2)); // true 저렇게 new 를 써서 객체를 생성하면 다른 객체가 생성되어 같지 않습니다. 하지만 new 를 쓰지 않고 객체를 생성 JVM 내부에서 동일한 리터럴값을 재사용하기 때..
[Book] ITEM 5) 리소스를 엮을 때는 의존성 주입을 선호하라
Repository 로 예를 들어 보겠습니다. InterfaceRepository 인터페이스가 save() 라는 기능을 가지고 있습니다. public interface InterfaceRepository { T save(); } 이를 구현한 MemoryBookRepository 클래스와 JdbcBookRepository 클래스를 생성합니다. public class MemoryBookRepository implements InterfaceRepository { @Override public Book save() { return null; } } public class JdbcBookRepository implements InterfaceRepository { @Override public Book save..
[Book] ITEM 4) private 생성자로 noninstantiability를 강제할 것
모든 클래스들이 인스턴스화가 필요한 것이 아닙니다. static 메서드와 static 필드들을 담은 클래스들을 인스턴스화를 시키지 않아도 기능들을 사용 할 수 있는데 굳이 인스턴스화를 시킬 필요는 없다고 봅니다. 역직렬화 기능을 담은 클래스가 있다고 가정해봅시다. public class ObjectDeSerialization{ private static ByteArrayInputStream byteArrayInputStream; private static ObjectInputStream objectInputStream; public static byte[]makeByteDecodeArray(String encodeObject) { return Base64.getDecoder().decode(encodeO..
[Book] ITEM 3) private 생성자 또는 enum 타입을 사용해서 싱글톤으로 만들것
오직 하나의 인스턴스만 만드는 클래스를 싱글톤이라 말합니다. 싱글톤 패턴을 생성하는 2가지 방법이 있는데 두 방법 모두 생성자를 private 으로 만들고 public static 멤버를 사용해서 유일한 인스턴스를 제공한다. 🟠 public static final 필드 첫번째 방법은 static final 필드로 인스턴스를 생성합니다. static 필드는 메모리에 올라갈 때 인스턴스를 단 한번만 생성해주는 장점이 있고 인스턴스가 여러번 생성이 되도 인스턴스는 동일한 객체입니다. public class Singleton { public static final Singleton singleton = new Singleton(); private Singleton() {} } 테스트 코드를 이용하여 동일한 객체..
[Book] ITEM 2) 생성자의 매개변수가 많다면 빌더를 고려하라
static 팩토리 메서드와 public 생성자 모두 매개변수가 많이 필요로 한 경우에 불편한점이 있고, 객체를 생성할 때 파라미터 값을 주는데 이러한 파라미터의 값들이 무슨의미인지 잘 모르는 경우가 많고 복잡한 문제점이 생긴다. // 필드값이 어떤 의미지?? Pet pet = new Pet(1L, "스폰지밥", "1월", "고둥길", 1D); 🔴 try 1 : 생성자 생성하고 싶은 필드들을 생성자를 사용하여 인스턴스를 만들 수 있다. 나는 이름과 주소만 받아서 생성할 꺼야! // 필수 필드의 파라미터 public Pet(String name, String address) { this.name = name; this.address = address; } 하지만 이러한 설정은 name 과 adress 만 ..