분류 전체보기 163

[JAVA] 정적 변수와 메소드 (static)

static 키워드 JAVA에서 static 키워드는 메모리에 한 번 할당된 후, 프로그램 종료 시점까지 해제되지 않음을 의미한다. static 키워드가 붙은 변수나 메소드는 각 객체(인스턴스)에 속하지 않고, 클래스 자체에 고정된다. 이러한 필드나 메소드를 통틀어 정적 멤버라 한다. 즉, 정적 멤버들은 위 그림에서 static 영역에 할당되어, 모든 객체가 공유해 어디서든 참조할 수 있다는 특징을 갖는다. 하지만 static 영역은 Garbage Collector의 관리 영역에 포함되지 않기 때문에, 프로그램 종료 시까지 메모리가 할당된 상태로 유지된다. 따라서 무분별한 사용은 좋지 않다. ※ Garbage Collector : 메모리 관리 기법 중 하나로, 프로그램이 동적으로 할당한 메모리 영역 중 ..

JAVA 2021.03.25

[디자인 패턴] MVC 패턴

MVC 패턴 MVC 패턴은 소프트웨어 디자인 패턴 중 하나로, 사용자 인터페이스와 비즈니스 로직을 분리해 두 영역을 서로 영향 없이 수정할 수 있도록 하여 유지보수성을 높이는 장점을 가진다. 일반적으로 웹 애플리케이션 서비스에서 MVC 패턴은 다음 그림과 같이 구성된다. M : 모델 (Model) 모델은 프로그램의 도메인 및 어플리케이션의 정보, 데이터에 대응한다. 예를 들어 상품 주문 서비스를 개발한다고 했을 때, 이를 개발하기 위해 필요한 회원, 상품, 주문 등의 도메인들이 이에 해당한다. 이러한 도메인들의 실제 데이터의 가공을 담당하는 컴포넌트들도 포함한다. 모델은 뷰나 컨트롤러에 대한 어떠한 정보도 알 필요가 없다. 이는 곧 데이터 변경이 일어났을 때 모델에서 뷰를 참조하는 속성을 가지면 안 된다..

Architecture 2021.03.24

[JAVA] 인터페이스와 추상 클래스 (Interface, Abstract Class)

인터페이스 (Interface) 인터페이스(Interface)란, 추상 메소드(Abstract Method)만으로 이루어진 클래스이다. 추상 메소드는 구현 내용 없이 선언만 해 놓는 형태로 정의된다. 즉, 인터페이스 내의 모든 메소드는 선언만 되어 있을 뿐, 그 내용은 없다. public interface Car{ //인터페이스 내의 변수는 반드시 static final로 지정한다. public static final int variable = 10; //인터페이스 내에서 지정한 메소드는 //반드시 이 인터페이스를 구현하는 클래스가 구현해야 한다. //즉, 클래스에게 특정 메소드들을 구현하도록 강제할 수 있다. public void Ride(); public void RideReverse(); publi..

JAVA 2021.03.20

[데이터베이스] 트랜잭션 (Transaction)

트랜잭션 (Transaction) 트랜잭션은 데이터베이스의 상태를 변화시키는 작업의 단위를 의미한다. 데이터베이스의 상태를 변화시킨다는 것은 곧 테이블에 행을 추가하거나, 갱신하는 것을 의미한다. (즉, SQL문의 실행을 의미한다.) 하지만 하나의 SQL문이 반드시 하나의 트랜잭션이 되는 것은 아니다. 여러 질의어들의 묶음 또한 트랜잭션이 될 수 있다. 따라서, 트랜잭션이라는 하나의 큰 상자에 여러 SQL문을 넣는다는 형태로 이해하면 된다. 트랜잭션의 성질 : ACID Atomicity (원자성) 트랜잭션은 반드시 완전히 수행되거나, 아예 아무것도 수행되지 않아야 한다는 성질이다. 이는 곧, 트랜잭션은 일부만 진행된 상태가 될 수 없음을 의미한다. 만약 트랜잭션이 수행되던 도중 오류가 발생한다면, 반드시..

데이터베이스 2021.03.19

[JPA] 다양한 연관관계

이번 포스팅에서는 다양한 연관관계들과, 그 연관관계를 JPA에서 어떻게 표현하는지 알아보자. 다대일 관계 (ManyToOne) 가장 많이 사용되기 때문에 꼭 알아야 하는 연관관계이다. 앞선 포스팅에서 살펴본 예시로, Member와 Team의 관계가 이에 해당한다. Member는 하나의 Team만 가질 수 있고, Team은 다수의 Member를 가질 수 있기 때문에, 이는 Member 입장에서 다대일 관계에 해당한다. @Entity public class Member{ @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; //연관관계 설정 : 멤버 입장에서 다대일 매핑 @Many..

JAVA/JPA 2021.03.19

[JPA] 연관관계 매핑

테이블 기준 객체 모델링 아래 코드들을 통해 Member와 Team의 연관관계를 모델링 해보자. @Entity public class Member{ @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @Column(name = "TEAM_ID") private Long teamId; } @Entity public class Team{ @Id @GeneratedValue private Long id; private String name; } //팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); //회원 ..

JAVA/JPA 2021.03.16

[JPA] JPA 매핑 - 기초

객체 매핑하기 @Entity : JPA가 관리할 객체 @Id : DB의 PK와 매핑할 필드 persistence.xml : JPA 속성 파일 hibernate.dialect 속성에 각 DBMS 언어 지원 EntityManagerFactory JPA는 Persistence 클래스에서 설정 정보를 읽는다. 이후 Persistence에서 EntityManagerFactory를 생성한다. EntityManagerFactory는 EntityManager를 생성한다. 매핑 어노테이션 @Column name : 필드와 매핑될 테이블의 칼럼 이름을 지정 insertable, updatable : T/F 설정, 읽기 전용 여부를 지정 nullable, unique length : 길이 제한 @Column(name = "..

JAVA/JPA 2021.03.16

[JPA] JPA 소개

SQL 중심 개발의 한계 다음 코드를 보자. public class Member{ private String memberId; private String name; //... } INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES ... SELECT MEMBER_ID, NAME FROM MEMBER M UPDATE MEMBER SET ... 위 코드에서, Member 객체에 전화번호 정보에 해당하는 필드 tel을 추가하고자 한다. 우리는 Member 객체에 단순히 tel 필드를 추가하는 것에 더해, 모든 MEMBER 관련 쿼리에 tel에 관한 정보를 추가해줘야 한다. 엔티티 신뢰성 문제 MemberDAO에서 Member 객체 하나를 꺼내왔다고 가정하고, 이 객체를 member라 ..

JAVA/JPA 2021.03.16

[Spring] 의존성 주입 (DI, Dependency Injection)

객체 의존성 (Object Dependency) 한 객체가 다른 객체를 참조하고 있을 때, 의존성을 가진다고 한다. 다음 예시를 보자. class Controller{ private MemoryRepository repository = new MemoryRepository(); } Controller 클래스에서 new 키워드를 이용해 MemoryReopsitory 객체를 생성했다. 이 때, Controller 객체는 MemoryRepository 객체에 의존한다고 한다. 의존성 주입 (Dependency Injection) 위의 의존 관계에는 문제점이 하나 있다. 만약 MemoryRepository 클래스가 수정된다면, Controller 클래스 또한 수정해줘야 하기 때문이다. 즉, 두 클래스의 결합도(..

JAVA/Spring 2021.03.10

SOLID : 좋은 객체 지향 설계의 5원칙

단일 책임 원칙 (SRP, Single Responsibility Principle) 하나의 클래스는 하나의 책임만 가져야 하며, 클래스는 이러한 책임을 캡슐화 하여야 한다. 이는 곧 클래스가 변경될 때, 그 이유는 단 한 가지여야만 한다는 말과 같다. 즉, 변경이 발생할 때 파급 효과가 적을수록 좋은 객체 지향 설계이다. class BookReader{ public String ReadBook(Book book); public void EditBook(Book book, int line, ...); } 위와 같은 클래스는 SRP를 만족하지 못한다. 왜일까? 현재 BookReader 클래스는 두 개의 책임을 가진다. Book 객체를 읽는 것(Read)과, Book 객체를 편집(Edit)하는 것이다. 만약..

JAVA 2021.03.10