반응형

프로그램을 작성하기 전에 테스트를 먼저 해라.

테스트 케이스 작성으로 구현을 시작하는 것, 그게 바로 TDD이다.

최종목표 "잘 동작하는 깔끔한 코드"

개발자가 처음으로 수행하는 테스트 = 개발자 테스트(Programmer test) = 단위 테스트(Unit test)



TDD 진행방식

  • Ask : 테스트 작성 ( 테스트 수행 결과는 실패)
  • Response : 테스트를 통과하는 코드를 작성해서 질문에 응답한다.(테스트 성공)
  • Refine : 통합, 불필요 제거, 명확하게 정제(리팩토링)



반응형
반응형

이클립스 단축키 


Ctrl+Alt+J

코드 정렬을 다음줄 문장 끝까지 한줄로 연결해준다.

블럭지정 하면 블럭지정 영역 만큼 한 라인으로 연결해준다.


Ctrl+Shift+F , 혹은 Ctrl+I 로 자동 포멧 정렬후 한줄로 하고 싶은 영역을 사용하면 좋을듯 하다.



Alt+위, 아래 

포커스된 라인통으로 위로 아래로 이동한다.


영역지정 Alt+위,아래

영역지정된 영역의 라인을 위로 아래로 이동한다.


Ctrl+D 

라인단위 삭제


영역지정 Ctrl+D

영역지정 부분 라인 삭제

반응형
반응형


 

 

book, publication relationbook, publication relation



 

 

 

 

@Entity(name = "Book")

@Table(name = "book")

public static class Book

implements Serializable {

@Id

@GeneratedValue

private Long id;

private String title;

private String author;

@NaturalId

private String isbn;

//Getters and setters omitted for brevity

}

 

 

Book은 관계에서의 부모쪽을 나타낸다.

isbn컬럼은 isbn컬럼은 비즈니스 키로 잘 사용할수 있기 때문에 @NaturalId로 맵핑 됩니다.

 

 

 

@Entity(name = "Publication")

@Table(name = "publication")

public static class Publication {

@Id

@GeneratedValue

private Long id;

private String publisher;

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(

name = "isbn",

referencedColumnName = "isbn"

)

private Book book;

@Column(

name = "price_in_cents",

nullable = false

)

private Integer priceCents;

private String currency;

//Getters and setters omitted for brevity

}

 

Publication은 관계에서 자식이다.

기본적으로 @ManyToOne 연결에서는 부모측 엔터티 식별자가 자식의 외부키 열과 조인하는데 사용된다고 가정 되나, 비식별자 연관을 할때는 referencedColumnName을 사용하여 ManyToOne 관계를 설정하기 위해 부모측에 어떤컬럼이 사용되어야 하는지를 설정합니다.

 

 

 

Publication publication = entityManager.createQuery(

"select p " +

"from Publication p " +

"join fetch p.book b " +

"where " +

" b.isbn = :isbn and " +

" p.currency = :currency", Publication.class)

.setParameter( "isbn", "978-9730228236" )

.setParameter( "currency", "&" )

.getSingleResult();

assertEquals(

"amazon.co.uk",

publication.getPublisher()

);

assertEquals(

"High-Performance Java Persistence",

publication.getBook().getTitle()

);

 

 

JQPL쿼리를 실행

 

SELECT

p.id AS id1_1_0_, b.id AS id1_0_1_,

p.isbn AS isbn5_1_0_, p.currency AS currency2_1_0_,

p.price_in_cents AS price_in3_1_0_,

p.publisher AS publishe4_1_0_,

b.author AS author2_0_1_, b.isbn AS isbn3_0_1_,

b.title AS title4_0_1_

FROM publication p

INNER JOIN

book b ON p.isbn = b.isbn

WHERE b.isbn = '978-9730228236'

AND p.currency = '&'

반응형
반응형

일반적으로 함수는 아래 4가지 요소가 필요합니다.

  • 이름
  • 리턴 타입
  • 파라메터
  • 함수 몸통

람다식은 위 4개중에 아래 2개만을 가집니다.

(parameter list) -> body

-> 왼쪽엔 파라메터 오른쪽엔 함수 본문을 정의합니다.

함수본문은 단일 표현식이나 명령문일수 있습니다.



(Integer e) -> e * 2
위코드는 단지 한줄짜리 람다식입니다.
세미콜론과 retrun 키워드가 없습니다.



(Integer e) -> {

double sqrt = Math.sqrt(e);

double log = Math.log(e);


return sqrt + log;

}

두개이상의 행으로 구성된 람다식입니다.

세미콜론과 결과를 반환하는 return 키워드도 필요합니다.




명령형 스타일 기능적 스타일


int result = 0;

for(int e : values) {

if( e>3 && e % 2 == 0 ) {

result = e * 2;

break;

}

}



int result = values.stream()

.filter(e -> e > 3)

.filter(e -> e % 2  == 0 )

.map(e -> e * 2)

.findFirst()

.orElse(0);



위에 두코드는 동일한결과를 얻을수 있습니다.

첫번재 코드는 분기와 중단을 통하여 흐름을 따라야 합니다.

두번째 코드는 기능 구성을 사용하여 가독성이 높습니다.


두번째 코드는 주어진 값이 3보다 큰값만 선택한다. 이값중에서 짝수값만 선택한다. 이값에 두배로 하고, 첫번째 값을 선택합니다.


함수표현식의 각각의 람다식의 간결성에 의존적입니다.

람다식이 여러줄로 펼처지는경우는 기능적스타일의 프로그래밍의 요점이 없어질수가 있습니다.


 

Sytem.out.println(values.stream()

.mapToInt(e-> {

int sum = 0

for (int i = 1; i <= e; i++){

if ( e % i == 0 ) {

sum += i;

}

}

return sum;

})

.sum());



이코든느 기능적 스타일로 작성 됬지만 기능적 스타일의 이점은 없어집니다.

  1. 읽기 어렵니다.
  2. 목적이 명확하지 않다.
  3. 코드품질이 나쁘다.
  4. 테스트하기가 어렵다.
  5. 코드 커버리지 불량.


문제를 해결하는 방법은 람다를 매우 간결하게 만드는 것이다.

람다에서 대괄호를 사용하지 마세요.

System.out.println(
values.stream90
.mapToInt(e -> sumOfFacetoers(e))
.sum());


public static int sumOfFactors(int number) {
return IntStream.rangeClosed(1, number)
.filter(i -> number % i == 0 )
.sum();
}



짧고 간결한 람다식은 코드 가독성을 높이며, 이것은 기능적 스타일에서 프로그래밍의 주요 이점중 하나 입니다.

여러줄로 펼처지는 람다식은 코드가 읽기가 어렵게된다. 다중 라인 람다는 테스트하고 재사용하기 어렵기 때문에 중복된 코드 생성과 품질 저하를 초해한다. 가능한 경우 람다식을 메서드 참조로 바꾸는것이 좋다.




https://www.ibm.com/developerworks/library/j-java8idioms6/index.html

반응형
반응형

{name: 'subjectTemplate', displayName: '제목', field : 'subject',  cellTemplate: '<div >{{grid.appScope.subjectCustom(row)}}</div>' },




var vm = this;

vm.subjectCustom = function( myRow ) {

    var subject = myRow.entity.subject;

    if ( myRow.entity.categoryName != null) {

    subject = '<span class="label label-primary">' + myRow.entity.categoryName + '</span> ' + subject;

    }

       return  subject;

    };






이렇게 하면 html 이 그대로 출력된다.


함수는 값만 리턴되게 하고 cellTemplate 안에 html코드 작성하여야 된다.


함수 선언도 

$scope.subjectCustom = function( myRow )



$scope 로 하면 안되었다.


var vm = this; 를 선언하여 

vm 내부에 함수 선언 해야한다.



 cellTemplate: '<div><span class="label label-primary">{{row.entity.categoryName}}</span> {{row.entity.subject}}</div>'

반응형
반응형

스프링 APA 하면서 Entity를 화면 전용 DTO 객체를 만들고 객체 변형하면서 삽질 하다가 발견한 유틸이다.


객체에 같은 프로퍼티의 값을 복사해준다.


BeanUtils.copyProperties(boardConfig, this);


void org.springframework.beans.BeanUtils.copyProperties(Object source, Object target) throws BeansException


Copy the property values of the given source bean into the target bean.

Note: The source and target classes do not have to match or even be derived from each other, as long as the properties match. Any bean properties that the source bean exposes but the target bean does not will silently be ignored.

This is just a convenience method. For more complex transfer needs, consider using a full BeanWrapper.

Parameters:
source the source bean
target the target bean
Throws:
BeansException - if the copying failed
See Also:
BeanWrapper


반응형
반응형

Error: [$compile:nonassign] http://errors.angularjs.org/1.5.0/$compile/nonassign?p0=activeIndex%20%3D%3D%201&p1=active&p2=uibTab


탭 클릭시 오류남


원인 : 1.2 이상에서만 작동된다.

ui-bootstrap-tpls-2.5.0.min.js 로 업데이트 적용 하니 된다.



https://angular-ui.github.io/bootstrap/ 여기에서는 잘되는데 난 왜안될까. 몇시간 해매다가 

버전이 다르다는걸 어찌 알아냈다. https://stackoverflow.com/questions/42999015/angular-uib-tabset-not-activate-tab


예제에 사용되는 라이브러리 버전과 내가 사용하는 버전이 일치 하는지 확인을 하는 습관만 있었다면..


반응형
반응형

2017-07-04 14:34:28.207  WARN 20716 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : 

Failed to bind request element: org.springframework.beans.TypeMismatchException: 

Failed to convert value of type 'java.lang.String' to required type 'com.jejunet.framework.core.entities.Code'; 


nested exception is org.springframework.core.convert.ConversionFailedException: 

Failed to convert from type [java.lang.String] to type [com.jejunet.framework.core.entities.Code] for value 'TEST'; 


nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: 

Provided id of the wrong type for class com.jejunet.framework.core.entities.Code. Expected: 

class java.lang.Long, got class java.lang.String; nested exception is java.lang.IllegalArgumentException: 

Provided id of the wrong type for class com.jejunet.framework.core.entities.Code. 

Expected: class java.lang.Long, got class java.lang.String





Code 클래스에 code 속성이 있어

콘트롤러에서 Code formCode 로 받으면 바인딩이 안된다.

클래스 명과 같은 속성이 있으면 안되는거 같아. 

클래스명 바꿔서 처리 함.

반응형
반응형




@ManyToOne

@JoinColumn(name = "code", referencedColumnName="code", nullable=false)

private Code code;



@JoinColumn 의 내부 속성으로, 참조키 컬럼을 입력한다.

자동키를 적용하고, 비식별관계로 설정했을시 참조키 컬럼을을 설정해야 한다.


@referencedColumnName

반응형
반응형

<<__Exception__>>

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 7 in XML document from file [/home/war_war___/WEB-INF/classes/egovframework/spring/com/context-transaction.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1.a: Cannot find the declaration of element 'beans'.

        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)

        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)

        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)

        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

        at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)

        at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)

        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)

        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)

        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)

        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)

        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)

        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)

        at jeus.servlet.listener.ListenerWrapper.contextInitialized(ListenerWrapper.java:81)

        at jeus.servlet.listener.ListenerManager.fireContextInitializedEvent(ListenerManager.java:284)

        at jeus.servlet.listener.ListenerManager.start(ListenerManager.java:163)

        at jeus.servlet.engine.Context.doStart(Context.java:1311)

        at jeus.servlet.engine.Context.execStart(Context.java:1113)

        at jeus.management.j2ee.WebModule.preStart(WebModule.java:388)

        at jeus.management.j2ee.J2EEManagedObject.start(J2EEManagedObject.java:860)

        at jeus.management.j2ee.J2EEDeployedObject.start(J2EEDeployedObject.java:301)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

        at java.lang.reflect.Method.invoke(Method.java:597)

        at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93)

        at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27)

        at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208)


버전이 맞는 lib 에 버전이 맞는게 없으면 해당주소로 xsd  설정 주소로 확인함(네트워크 이슈로 연결이 안될수 오류남)
lib 에 있는 xsd 버전 잘 찾아서 맞쳐주면된다. spring-beans-3.2.xsd
그래도 안되면 maven assembly 이용해서 spring.schemas, spring.handlers 파일 이용해서 로컬 lib에 있는 xsd파일로 참조하게 설정하는 방법도 있다.


반응형

+ Recent posts