• 인터페이스는 객체 사용 설명서 (공통API의 역할)
    인터페이스의 메소드는 전부 abstract 메소드 (키워드 생략)
  • 자바7까지는 추상메소드만 선언가능했는데
    자바8에서부터는 디폴드메소드, 정적메소드도 선언가능
  • 코드수정없이 객체를 변경할 수 있다
    > 동일기능의 구현객체를 새로만들고 선언부만 변경 가능
  • 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출
  • 인터페이스의 구현클래스에서 메소드를 작성할때 더 낮은 접근제한을 지정할수없음
    (추상메소드는 디폴트로 public)
    인터페이스 설계의 핵심은 선언부를 얼마나 추상화하여 작성할 것인가...
  • 인터페이스는 다중상속 가능
  • 디폴트 메소드 필요성
    - interfaceA 를 사용하다가 추가할 기능이 생겼을때 추상메소드를 추가하면 interfaceA 구현체에 모두 추가해줘야하는데
    디폴트메소드는 추상메소드가 아니기 때문에 구현클래스에서 모두 작성해줄 필요가 없음
    - 리턴타입 앞에 default 작성
  • 인터페이스 vs 추상클래스
    접근제한자 모두 public / 접근제한자 지정 가능
    구현객체가 동일기능을 구현 / 핵심로직은 추상클래스에서 정의하고 달라지는 부분만 구현객체에서 작성
    > 나중에 디자인패턴에서 쓰임 비교해보기


1번 - 3
2번 - 4
3번 -

public class Cat implements Soundable {
  @Override
  public String sound() {
  	return "야옹";
  }
}
public class Dog implements Soundable {
  @Override
  public String sound() {
  	return "멍멍";
  }
}


4번 -

public interface DataAccessObject {
  void select();
  void insert();
  void update();
  void delete();
}
public class OracleDao implements DataAccessObject {
  public void select() {
  	sysout("OracleDB에서 검색")
  }
  public void insert() {
  	sysout("OracleDB에서 삽입")
  }
  public void update() {
  	sysout("OracleDB에서 수정")
  }
  public void delete() {
  	sysout("OracleDB에서 삭제")
  }
}
  
public class MySqlDao implements DataAccessObject {
  public void select() {
  	sysout("MySqleDB에서 검색")
  }
  public void insert() {
  	sysout("MySqleDB에서 삽입")
  }
  public void update() {
  	sysout("MySqleDB에서 수정")
  }
  public void delete() {
  	sysout("MySqleDB에서 삭제")
  }
}


5번 -

Action action = new Action() {
	public void work() {
		sysout("복사를 합니다.");
	}
};

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

자바 커뮤니티2 - 상속  (0) 2019.05.28
자바 커뮤니티1 - Class  (0) 2019.05.22
Java 문자열 객체  (0) 2018.08.04
Java 배열 선언, 초기화  (0) 2018.08.04
Java 접근지정자 (Access Modifier)  (0) 2018.08.04

*추상클래스 개념

- 추상은 사전적 의미로 실체간의 공통되는 특성을 추출하는 것

- 실체클래스들의 공통특성을 추출해서 선언한 클래스를 추상클래스

- 추상클래스와 실체클래스는 상속관계에 있고 추상클래스의 모든 특성을 물려받음

- 추상클래스로는 직접 객체를 생성할 수 없다.

 

*추상클래스 용도

- 표준화: 실체클래스들의 공통된 필드와 메소드의 이름을 통일할 목적

(개발자간 문서설계로도 가능하지만 추상클래스로 잘 설계해놓으면 코드만 보고도 실체클래스들을 구현할 수 있다.)

- 개발시간단축: 실체클래스를 작성할 때 시간 절약

(공통적인 필드와 메소드는 추상클래스에 정의해두고 실체클래스마다 다른기능만 개발하면 개발시간을 단축시킬수있다.)

- 사내에서도 BaseBatch 라는 추상클래스가 있어서 이를 상속받아 배치를 구현하는 프로세스가 있다.

- *잘만들어진 추상클래스는 프레임워크나 오픈소스같은 곳에서 유용하게 사용되고있다.

(메인로직은 추상클래스에 정의하고 구현체에서는 각 애플리케이션 기능의 특성을 담는 구조로 개발가능)

 

*자바는 다중상속이 불가능하지만 인터페이스로 다중상속 가능

*인터페이스는 다음시간에!

 

 

[ 확인문제 ]

1 - 1

자바는 다중상속을 허용하지 않음

 

2 - 2

부모-자식 상속 관계에서 자식클래스를 자동타입변환한 부모클래스에 대해서만 강제타입변환이 가능

// 자동타입변환을 하면 부모클래스에 있는 메소드만 사용할수있는 제약이 생기기때문

 

3 - 1

final 클래스로 상속을 할수없기 때문에 부모클래스가 될수없음

 

4 - 4

protected 접근제한을 갖는 메소드는 다른 패키지의 자식클래스에서 재정의 가능

 

5

자식클래스의 생성자에서 자동으로 super(); 를 호출하는데

부모클래스에 디폴트 생성자가 없음 (매개변수생성자가 있으면 내부적으로 디폴트생성자 안생김)

이를 해결하기 위해서는 부모클래스에 디폴트생성자를 추가하거나

자식클래스에서 부모클래스의 매개변수생성자를 명시적으로 호출하면됨

 

6

Parent(String nation) call

Parent() call

Child(String name) call

Child() call

 

7

일반타이어가 굴러갑니다.

스노우타이어가 굴러갑니다.

// 자동타입변환을 해도 해당 객체로는 부모클래스의 메소드만 접근 가능

 

8 - 2

자식클래스를 자동타입변환한 부모클래스에 대해서만 강제타입변환이 가능

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

자바 커뮤니티3 - 인터페이스  (0) 2019.06.05
자바 커뮤니티1 - Class  (0) 2019.05.22
Java 문자열 객체  (0) 2018.08.04
Java 배열 선언, 초기화  (0) 2018.08.04
Java 접근지정자 (Access Modifier)  (0) 2018.08.04

1. pom.xml dependency 추가

- scope 에 대한 정의는 더 찾아보기  

<dependency> <!-- spring.io 에서 프로젝트 생성시 설정 -->
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- mssql  -->
<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <scope>test</scope>
</dependency>

2. application.properties에 datasource 설정

# dev datasource (mssql) 
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://[db서버정보];databasename=[db이름]
spring.datasource.username=[계정아이디]
spring.datasource.password=[계정패스워드]

 

 

** Boot의 pom.xml은 parent pom.xml을 참조하고 있어서 스프링부트버전에 맞는 디펜던시를 가져오기 때문에 version정보를 보통 생략한다고 한다. > 이 내용도 좀 더 자세히 찾아봐야할듯

 

추후 참고글: https://jeong-pro.tistory.com/168

 

https://bbchu.tistory.com/53

 

Spring Boot 프로젝트 셋팅2 - 프레임워크

서버에 톰캣8.5 / Java1.8 설치가능한 것을 확인하고 프레임워크 셋팅을 시작했다. 프레임워크는 Maven 기반 spring boot 프로젝트를 import하여 셋팅하였다. (https://start.spring.io/ 에 접속하여 빌드환경과..

bbchu.tistory.com

지난 작업에 이어서 오늘은 화면템플릿인 sitemesh를 적용해보았다.

기존 사이트가 jsp를 사용하고 있는데 퍼블리싱은 도저히 손댈수가 없어서.. jsp기반의 템플릿을 사용했다.

 

1. pom.xml dependency 추가

<!-- sitemesh -->
<dependency>
<groupId>opensymphony</groupId>
  <artifactId>sitemesh</artifactId>
  <version>2.4.2</version>
</dependency>

2. Bean 등록

- 부트에서는 Application 클래스에 명시적으로 Bean을 등록 (mvc에서는 web.xml 에 설정)

@SpringBootApplication
@EnableAutoConfiguration
public class HdlApplication {

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

  @Bean
  public FilterRegistrationBean siteMeshFilter() {
    FilterRegistrationBean filter = new FilterRegistrationBean();
    filter.setFilter(new SiteMeshFilter());
    return filter;
  }
}

3. xml 설정  

- sitemesh를 사용하기 위해서는 decorators.xml 파일을 설정해줘야하는데

- 부트를 쓰는 경우에 해당 파일은 webapp/WEB-INF/ 하위에 위치해야 자동으로 설정이 된다.

- decorators.xml 에서는 exclude 할 패턴과 header, footer 정보들을 설정하면 됨

<?xml version="1.0" encoding="UTF-8"?>

<decorators defaultdir="/WEB-INF/jsp/adm/">
  <excludes>
    <!-- 예외처리 패턴 -->
    <pattern>**.html</pattern>
    <pattern>**/loginform</pattern>
  </excludes>

  <!-- ADMIN DECORATOR START -->
  <decorator name="web_admin" page="layout/template.jsp">
    <pattern>/adm/*</pattern>
    <pattern>/WEB-INF/jsp/adm/**</pattern>
  </decorator>

  <decorator name="web_admin_header" page="layout/header.jsp"/>
  <decorator name="web_admin_footer" page="layout/footer.jsp"/>
  <!--// ADMIN DECORATOR END -->

</decorators>

 

사내에서 자바 커뮤니티를 개설하여 기본 개념은 다시 공부하고 Java8의 새로운 개념, 문법을 공부해보려고한다.

교재는 팀원들과 [이것이 자바다 - 신용권의 Java 프로그래밍 정복] 으로 정하였고 나는 ch6. 클래스부터 참여하였다.

아래는 연습문제풀이 및 스터디 시간에 공유한 내용이다. (코드복붙하다가 인덴테이션이나 문법같은게 조금 깨졌..)

 

* 디폴트 생성자의 접근지정자

- 명시안하면 클래스의 접근지정자를 따라감

 

* 싱글톤

- 스프링에서 생성되는 모든 빈은 싱글톤 모드

- JSP도 싱글톤으로 jsp가 서블릿으로 변환되면 계속 그걸로 재사용

- 실무에서 싱글톤 패턴 사용하는 방법은 여러가지가 있는데

- syncronized 키워드 사용은 제일 구현 간단하지만 저 키워드 자체가 lock이 걸려서 진행되기 때문에 성능저하 발생가능

- 요즘엔 Holder 패턴을 많이 쓰는데 classloader 의 특징을 이용해 만든 패턴 >좀 더 자세히 찾아보기

 

* 클래스의 접근지정자

- 클래스에는 public default 만 사용

 

* getter/setter 를 왜 쓰는지

 

* 리플랙션

- 런타임시에 클래스 정보를 가져오는 기법

- 프레임워크를 만든다면 리플랙션은 필수

- 리플랙션하려면 annotation 유지정책을 runtime으로 지정

 

* 클래스의 로딩시점

- 클래스를 참조할때 클래스로더에 올라가고

- static 변수, 메소드 등은 그때 정의됨

 

 

1 – 3)

하나의 클래스로 여러 개의 객체생성 가능

 

2 – 4)

 

3 – 4)

필드, 메소드 생략가능

 

4 – 3)

생성자/메소드 앞뒤에서 모두 선언가능ㅎ지만

생성자와 메소드 내부에서는 선언할수없음

 

 

5 – 1)

생성자를 실행시키지않으면 객체생성 불가능

 

6 – 4)

오버로딩(메소드이름은 같고, 매개변수 형태 다른경우)으로 가능

 

7 – 2)

리턴타입은 같아도 됨

 

8 – 2)

정적블록 내부에서 인스턴스 필드나 인스턴스 메소드를 사용할수없음

사용하고싶으면 내부에서 객체생성후 참조변수로 접근

 

9 – 2)

상수는 초기값 또는 정적블록에서 선언가능

 

10 – 4)

클래스만 복사해서 이동하면 사용할수없음

 

11 – 3)

동일패키지 내에 속한 클래스들은 접근가능

 

12필드, 생성자, 메소드

 

13/14

Public class Member {

 private String name;
 private String id;
 private String password;
 private String age;

 public Member() {}

 public Member(String name, String id) {
   this.name = name;
   this.id = id;
 }
}

 

15

Public class MemberService {
 Public Boolean login(String id, String password) {
	If (“hong”.equals(id) && “12345”.equals(password)) {
	return true;
 }
 Return false;
}

 Public void logout(String id) {
 	System.out.println(id+“님, 로그아웃 되었습니다.”);
 }
}

16

Public class Printer {
  Public void println(int val) {
      System.out.println(val);
  }

  Public void println(boolean val) {
      System.out.println(val);
  }

  Public void println(double val) {
      System.out.println(val);
  }

  Public void println(String val) {
      System.out.println(val);
  }
}

17

Public class Printer {
  Public static void println(int val) {
  	System.out.println(val);
  }
  Public static void println(boolean val) {
  	System.out.println(val);
  }

  Public static void println(double val) {
  	System.out.println(val);
  }

  Public static void println(String val) {
  	System.out.println(val);
  }

}

 

18

Public class ShopService {
  Private static ShopService singleton;
  Private ShopService() {}

  Public static ShopService getInstance() {

    If (singleton==null) { 
    	Return new ShopService();
    }
    else singleton;
  }
}

 

19

Public class Account {

 Public static final MIN_BALANCE=0;
 Public static final MAX_BALANCE=1000000;
 Private int balance;

 Public void setBalance (int balance) {
   if (MIN_BALANCE <= balance && MAX_BALANCE <= balance) {
      This.balance = balance;
   }
   Return this.balance;
  }

  Public int getBalance () {
      Return this.balance;
  }

}

20

 

//  현재 몇번째 array 인지 파악하기 위한 용도 
public static int curArrCnt = 0; 

Private static void createAccount() {
   //scanner 로 입력
  Account acc = new Account(ano, owner, balance);
  System.out.println(“계좌가 생성되었습니다.”);
  accountArray[curArrCnt++] = acc;
}

Private static void accountList() {
  For(int I = 0 ; I < accountArray.lenth; i++) {
    System.out.println(accountArray[i].getAno() + “ ” 
    + accountArray[i].getOwner() + “ “ + accountArray[i].getBalance());
  }
}

Private static void deposit() {
  // scanner 로 계좌번호, 예금액 입력
  Account acc = findAccount(ano);
  Int curBal = Acc.getBalance();
  Acc.setBalance(curBal+balance);
}

Private static void withdraw() {
  // scanner 로 계좌번호, 출금액 입력
  Account acc = findAccount(ano);
  Int curBal = Acc.getBalance();
  Acc.setBalance(curBal-balance);
}

Private static Account findAccount(String ano) {
  For(int I = 0 ; I < accountArray.lenth; i++) {
    If (accountArray[i].getAno() == ano)
    	Return accountArray[i];
  }
}

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

자바 커뮤니티3 - 인터페이스  (0) 2019.06.05
자바 커뮤니티2 - 상속  (0) 2019.05.28
Java 문자열 객체  (0) 2018.08.04
Java 배열 선언, 초기화  (0) 2018.08.04
Java 접근지정자 (Access Modifier)  (0) 2018.08.04

서버에 톰캣8.5 / Java1.8 설치가능한 것을 확인하고 프레임워크 셋팅을 시작했다.

프레임워크는 Maven 기반 spring boot 프로젝트를 import하여 셋팅하였다.

(https://start.spring.io/ 에 접속하여 빌드환경과 부트 버전, dependency 설정 > 프로젝트 내려받아 이클립스에서 import)

 

빌드환경 : Maven

Spring Boot : 1.5.21 (1.5.x는 Spring 4.0 기반 2.x.x는 Spring 5.0 기반)

Java Version : 8

패키징 : war (war는 외장 톰캣, jar는 내장톰캣 설정인데 나는 별도 톰캣으로 진행해야하므로 war선택)

이클립스 버전 : Photon

 

1. jsp 설정

스프링부트에서는 공식적으로는 jsp를 지원하지 않고

freemarker나 thymeleaf 같은 화면템플릿을 지원하기 때문에 템플릿 사용을 고려했으나, 

회사에서는 아직까지 jsp를 사용하고 있고 퍼블리싱 지원이 없기 때문에 jsp 전체 전환은 무리여서 기존대로 가기로했다.

 

jsp 설정은 application.properties 파일에 아래 두줄을 설정하였다.

spring.mvc.view.perfix=/WEB-INF/jsp/

spring.mvc.view.suffix=.jsp

// WEB-INF는 src/main/webapp 하위에 생성하고 js, css같은 정적파일들은 src/main/resource/static 하위에 생성하였다.

 

2. 테스용 controller 설정

초반에 샘플용 컨트롤러를 만들어서 index.jsp 화면 띄우기를 시도하다 자꾸 에러가 났는데

그 이유는 스프링부트가 초기환경을 자동으로 셋팅해줘서 dataSource 같은 기본셋팅이 누락되어 생긴 에러였다.

아래와같이 @EnableAutoConfiguration(자동설정활성화) 어노테이션에 dataSource 를 예외하고 몇몇 아직 설정하지 않은 dependency 들을 주석처리하여 해결하였다.

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

 

3. Maven 설정

폐쇄망 환경에서 로컬 Maven Repository를 구성하기 위해 setting.xml 을 설정하고 이클립스에 경로를 잡아줬다.

// 이클립스에서 window > preference > Maven > User settings > setting.xml 경로와 m2 폴더 경로 설정 가능

 

<향후진행사항>

이후에는 기존 jsp 구성 전환과 DB 설계, RestAPI 적용에 대한 설계부분을 진행하려고 한다.

 

 

 

참고: https://eddies.tistory.com/12

 

Spring Boot 프로젝트 만들기 (with. 이클립스 Maven)

이클립스에서 Spring Boot Project를 생성&시작 하는 방법을 알아보도록 하겠습니다. 보통은 이클립스 마켓에서 STS(Spring tool Suite)를 인스톨 받아 프로젝트를 생성할 수있습니다. 하지만. 제가 포스팅하는 주..

eddies.tistory.com

 

최근 운영하고 있는 시스템이 개편을 하게 되어 spring boot로 프로젝트를 진행하게 되었다.

개발에 앞서 현재 구동되고 있는 개발/운영 서버에 환경셋팅을 잡아보려고한다.

 

[ 현재 서버 구성 ]

OS버전 : Windows Server 2012 R2 (윈도우 8.1)

OS사양 : 4기가 64비트 (개발, 운영 동일)

IIS버전 8.5

톰캣버전 :  7.0 

 

제일 먼저 확인할 사항은 현재 운영되고 있는 서버에서 톰캣/자바 버전업이 가능한가이다. 

버전에 따라 이클립스나 spring boot 버전도 결정되기때문에 먼저 확인해보았다. 

서버에 한 시스템만 구동돼있다면 크게 문제가 없었겠지만, 현재 시스템은 한 서버에 여러 서비스가 인스턴스별로 구동중이어서 내가 쓰는 인스턴스만 버전업할 경우 타 시스템에 영향을 끼칠 수도 있다.

 

따라서 톰캣 8.5버전과 자바8을 서버에 설치 후, 새로운 인스턴스를 구동하고 테스트용 war를 배포해보는 작업을 진행했다.

새로 설치한 톰캣에 java_home, catalina_home, catalina_base 등 내 인스턴스에만 사용할 환경변수를 적용하고 startup.bat 명령으로 war 배포까지는 성공을 했는데 해당 작업을 윈도우 서비스에 등록해서 시작하면 아래와 같은 에러가 계속되었다. 

 

// 에러내용

%1 은 올바른 win32 응용 프로그램 이 아닙니다.

failed creating java jvm.dll

 

톰캣에서 자바를 못잡는것 같기도하고 윈도우서비스로 시작할 경우 bin/tomcat8.exe 파일을 실행시키는데 다른 .bat 파일에 있는 설정정보를 못읽는 것 같기도해서 이부분은 좀더 파악해봐야할 것 같다. 

 

===========19.05.21============

결국 서버에 톰캣 설치형 파일을 올려서 셋팅했다. 

설치형은 자동으로 윈도우 서비스까지 걸려서 server.xml이나 context.xml 정도만 수정하여 셋팅을 완료하였다.

 

 

 

 

  1. 회원가입 (https://cloud.mongodb.com)
  2. 서버생성
    • 프리티어 표시된 리전의 서버 선택 & M0 서버 선택
  3. Clusters connect
    • sandbox에서 connect 선택
    • 참고글 참고 (현재 아이피 등록가능)
  4. IP 방화벽설정
    • 처음 connect 맺을 때 현재 IP 등록 가능하긴 하지만 관리편의성을 위해 해당 메뉴에서 별도 등록 
    • overview 옆에 security tab > ADD IP address > 0.0.0.0/0 (any) 추가 또는 원하는 특정 IP 추가  

 

참고글: https://fkkmemi.github.io/nemv/nemv-037-mongodb-atlas/

'데이터베이스 > MongoDB' 카테고리의 다른 글

mongoDB 간단 문법  (0) 2019.03.19
mongoose 연동  (0) 2019.03.19

ganache를 사용하다보니 세팅하는 방법마다 포트가 달라서 구분 방법을 찾아보았다.

여러 툴을 사용할 때 포트충돌이 나지않게 하려는 의도인 것 같다.


[ ganache-gui 를 쓰는 경우 ]

localhost:7545


[ ganache-cli 를 쓰는 경우 ]

localhost:8545


[ truffle에 내장된 testRPC 를 쓰는 경우 ] > truffle develop 명령어로 구동

localhost:9545

기존 RDBMS 와 비교하면,

컬렉션 - 테이블

다큐먼트 - 데이터 row 이다.



test 라는 dbms 에 users 컬렉션 생성하고


// users 에 다큐먼트 생성시

db.users.insert({"id": "test", "age": "test", "email": "", "ipfsValue": "", "gender": "", "account": ""})


// 컬랙션의 다큐먼트 리스트 조회

db.users.find()


ex)

{ "_id" : ObjectId("56c08f3a4d6b67aafdeb88a3"), "name" : "MongoDB Guide", "author" : "Velopert" }

{ "_id" : ObjectId("56c08f474d6b67aafdeb88a4"), "name" : "NodeJS Guide", "author" : "Velopert" }

{ "_id" : ObjectId("56c0903d4d6b67aafdeb88a5"), "name" : "Book1", "author" : "Velopert" }

{ "_id" : ObjectId("56c0903d4d6b67aafdeb88a6"), "name" : "Book2", "author" : "Velopert" }






참고글 : https://velopert.com/436

'데이터베이스 > MongoDB' 카테고리의 다른 글

Atlas 사용 방법  (0) 2019.04.02
mongoose 연동  (0) 2019.03.19

+ Recent posts